2010-09-17 7 views
6

Soy nuevo en C# y Windows Form, pero si tengo un botón de radio y llamo radiobutton1.Checked = cierto, ¿hay alguna forma de que no se active el evento CheckedChange? Quiero distinguir entre el usuario que hace clic en el botón de radio y yo configurando el botón de radio programáticamente. es posible?Cuando configura la propiedad Controlada en un RadioBox, ¿puede suprimir el evento CheckChanged?

+2

Esto me parece un problema de diseño. ¿Qué comportamiento estás tratando de definir? – womp

+0

Sí, probablemente pueda diseñar alrededor, pero estoy acostumbrado a que los controles no envíen eventos si se llama a SetValue. wxWidgets funciona así y hace la vida más fácil.Ok, parece que la respuesta es no; evento está activado y no puede ser suprimido. Gracias. – genomess

Respuesta

1

¿Por qué debería preocuparse por su código? ¿Quién consultó el botón de radio?

EDITAR: Hay formas de evitar esto (subclase, indicador), pero no. La única razón "de fiar" que se me ocurre para querer esto es evitar que ocurra algún efecto secundario cuando el valor se muestra inicialmente (programáticamente), e incluso eso es sospechoso. Repensar el efecto secundario, ¿realmente pertenece al evento de cambio o al compromiso?

Más información uno por qué/qué ayudaría. En la superficie, esto parece un error de diseño.

+0

Creo que quiere hacer cosas diferentes según los usuarios que hagan clic y cambien el código subyacente. –

+0

Tienes razón. – genomess

+0

entiendo que es lo que quiere el OP; no entiendo por qué, y sospecho un error de diseño en la necesidad –

0

Una forma (hacker) que hacerlo sería una subclase RadioButton y anular el método virtual OnCheckChanged, suprimiendo el caso si la propiedad Checked se ha establecido mediante programación.

Sin embargo, dado que los botones de opción pertenecen a un grupo, el evento siempre se dispara de a pares (por ejemplo para la desactivación, uno para la verificación). Por lo tanto, querrá suprimir el evento para el grupo completo cuando elige el botón seleccionado mediante programación. He aquí un ejemplo de implementación:

public class CustomRadioButton : RadioButton 
{ 
    private bool _suppressCheckedEvent; 

    public void SetChecked(bool value, bool suppressCheckedEvent) 
    { 
     if (!suppressCheckedEvent) 
      Checked = value; 
     else 
     { 
      SetSupressModeForGroup(true); 
      Checked = value; 
      SetSupressModeForGroup(false); 
     } 
    } 

    private void SetSupressModeForGroup(bool suppressCheckedEvent) 
    { 
     foreach (var crb in Parent.Controls.OfType<CustomRadioButton>()) 
      crb._suppressCheckedEvent = suppressCheckedEvent; 
    } 

    protected override void OnCheckedChanged(EventArgs e) 
    { 
     if (!_suppressCheckedEvent) 
      base.OnCheckedChanged(e); 
    } 
} 

En esta implementación, el cambio del estado marcada por la propiedad Checked siempre se disparará el evento. Cuando llama al método SetChecked, tiene la opción de suprimir el evento.

2

Aquí hay un método sencillo de usar el evento cuando te da la gana.

private bool SuppressRadioButton1Event { get; set; } 

private void radioButton1_CheckedChanged(object sender, EventArgs e) 
{ 
    if (!this.SuppressRadioButton1Event) 
    { 
     MessageBox.Show("Not suppressed!"); 
    } 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    this.SetRadioButton1(false); 
} 

private void SetRadioButton1(bool checkedOn) 
{ 
    this.SuppressRadioButton1Event = true; 
    radioButton1.Checked = checkedOn; 
    this.SuppressRadioButton1Event = false; 
} 
+0

+1 Tengo que admitir que esta forma de 'marcar 'es mejor que la mía :) –

2

Una forma muy fácil:

public void radio_OnCheckChanged(object sender, EventArgs e) 
{ 
    RadioButton r = sender as RadioButton; 
    bool isUserChange = r.Tag.Equals(1); 
    if (isUserChange) blabla 
    else blabla 
    r.Tag = null;  
} 

public void MyMethod() 
{ 
    radio1.Tag = 1; 
    radio.Checked = true; 
} 

Se puede utilizar cualquier tipo de flag el que los usuarios no pueden hacer por su clicking.But se puede hacer a través de su código.

+0

Establecer la etiqueta en otro marcador en lugar de nulo evitará la excepción de uso nulo. – amalgamate

6

Deje de intentar rechazar el diseño del evento CheckedChanged. Se supone específicamente que debe incluir cambios programáticos.

Si desea cambios activados por el usuario y no cambios programáticos, use el evento Click en su lugar. (Puede pensar que no desea limitarse a clics del mouse, no se preocupe, hay un evento MouseClick para eso, Click incluye también cambios en el teclado)

+0

Esto no dispara para un 'RadioButton' cuando pasa de un estado marcado a un estado no verificado. – Ani

+0

@Ani: genomess dijo que quería un evento para disparar solo cuando el usuario hace clic en el botón. Estoy bastante seguro de que el botón de opción nunca se desactiva si el usuario hace clic en él. –

+0

Bien, es suficiente. – Ani

-1

Puede intentar adjuntar el evento mediante programación . En función de la configuración de mi aplicación, verifico varios botones de opción pero no deseo disparar eventos. Para adjuntar un evento mediante programación:

chbOptionX.CheckedChanged + = new System.EventHandler (this.chbShowStockBySizeAndColor_CheckedChanged);

+0

Pero aún así no se puede distinguir entre los cambios inducidos por el colocador y el clic cuando se dispara el evento. – DerMike

Cuestiones relacionadas