2012-07-15 50 views
20

Lea mi pregunta, no es una duplicada.El botón de radio revisado cambió el evento se dispara dos veces

Tengo tres botones de opción en el formulario de Windows y todos estos botones tienen asociado el evento 'CheckedChanged'. Cuando hago clic en cualquiera de estos botones de opción, desencadena el evento 'CheckedChanged' dos veces.

Aquí está mi código:

private void radioButtons_CheckedChanged(object sender, EventArgs e) 
{ 
    //My Code 
} 

insertar el punto de interrupción y todo el código dentro de este evento repite dos veces. Por favor, dime por qué se comporta así?

+1

su pregunta ya está respondida, consulte la publicación http://stackoverflow.com/questions/8050296/asp-net-4-0-radio-button-checked-changed-event-fires-only-once – HatSoft

+1

No parece que su enlace responder está relacionado con esta pregunta. –

Respuesta

45

Como los otros que responden correctamente decir, el evento se dispara dos veces porque cada vez que se marca un RadioButton dentro de un grupo, otro se desactivará; por lo tanto, el evento cambiado marcado se activará dos veces.

única para realizar cualquier trabajo dentro de este evento para la RadioButton que acaba de ser seleccionado se puede ver en el objeto emisor, haciendo algo como esto:

void radioButtons_CheckedChanged(object sender, EventArgs e) 
{ 
    RadioButton rb = sender as RadioButton; 
    if (rb != null) 
    { 
     if (rb.Checked) 
     { 
      // Only one radio button will be checked 
      Console.WriteLine("Changed: " + rb.Name); 
     } 
    } 
} 
+1

¿No adelgaza 'si (rb! = Null)' no es necesario? –

+2

@MuhammadAliDildar Evita cualquier posibilidad de una excepción de referencia nula aquí - por supuesto, ya que conecta todos los eventos, puede estar bastante seguro de que este controlador de eventos solo se adjuntará a un botón de radio, pero la forma de "mejores prácticas" de hacer cosas es verificar que el yeso funcionó. Por otra parte, desde un cierto punto de vista, lanzar una excepción cuando se adjunta incorrectamente el controlador de eventos puede ser preferible para que pueda corregir el código. –

+0

Muchas gracias. Solucionó mi problema. –

3

CheckedChanged se genera cada vez que cambia la propiedad controlada. Si selecciona un RadioButton, el RadioButton seleccionado previamente se desmarca (CheckedChanged disparado), y luego se marca el nuevo RadioButton (activado CheckedChanged).

2

Se desencadenar una vez para la transición botón de opción de marcado a desmarcado, y de nuevo para la transición botón de opción de marcar para verificar (es decir, cualquier cambio en el estado activado activa el evento)

0

Se podría establecer la propiedad AutoCheck cierto para cada RadioButton luego capture el evento Click en lugar del evento CheckChanged. Esto aseguraría que solo se active un evento, y la lógica en el controlador puede enviar al remitente a escribir RadioButton si es necesario para procesar el clic. A menudo, el yeso puede evitarse si la lógica del manejador es simple. Este es un ejemplo que se ocupa de tres controles, rbTextNumeric, rbTextFixed y rbTextFromFile:

 private void rbText_Click(object sender, EventArgs e) 
    { 
     flowLayoutPanelTextNumeric.Enabled = rbTextNumeric.Checked; 
     txtBoxTextFixed.Enabled = rbTextFixed.Checked; 
     flowLayoutPanelTextFromFile.Enabled = rbTextFromFile.Checked; 
    } 
0
{ 
    public partial class Form3 : Form 
    { 
     public Form3() 
     { 
      InitializeComponent(); 
     } 
     int click = 0; 
     private void radioButton1_Click(object sender, EventArgs e) 
     { 
      click++; 
      if (click %2==1) 
      { 
       radioButton1.Checked = true; 
      } 
      if (click %2==0) 
      { 
       radioButton1.Checked = false; 
      } 
      if (radioButton1.Checked==true) 
      { 
       label1.Text = "Cheked"; 
      } 
      if (radioButton1.Checked==false) 
      { 
       label1.Text = "Uncheked"; 
      } 
     } 

    } 
} 
+1

¿Tal vez debería agregar alguna explicación para el código anterior? – davidkonrad

+0

@davidkonrad * ¡el código real * nunca debería necesitar ninguna explicación! Doh! –

0

Para evitarlo, simplemente comprobar si radioButton se comprueba

por ejemplo:

private void radioButton1_CheckedChanged(object sender, EventArgs e) 
{ 
    if (radioButton1.Checked == true) 
     //your code 
} 
Cuestiones relacionadas