2010-05-06 40 views
42

Windows Forms' CheckBox control implementa los eventos CheckedChanged y CheckStateChanged. Por lo que puedo decir, ambos disparan cuando se cambia el estado marcado de la casilla de verificación.Windows Forms 'CheckBox CheckedChanged vs. CheckStateChanged

CheckedChanged precede CheckStateChanged, pero aparte de eso, no veo la diferencia. ¿Me estoy perdiendo de algo? ¿Debería uno ser preferido sobre otro?

Respuesta

18

Supongo que tiene que ver con las casillas de verificación de tres estados. Esto es las tripas del setter CheckState:

if (this.checkState != value) 
{ 
    bool flag = this.Checked; 
    this.checkState = value; 
    if (base.IsHandleCreated) 
    { 
    base.SendMessage(0xf1, (int) this.checkState, 0); 
    } 
    if (flag != this.Checked) 
    { 
    this.OnCheckedChanged(EventArgs.Empty); 
    } 
    this.OnCheckStateChanged(EventArgs.Empty); 
} 
55

CheckState (y por tanto CheckStateChanged) permitir el uso de una casilla de verificación que puede tener tres valores: se puede comprobar, sin control o 'indeterminado' - es decir, tiene ThreeState conjunto de cierto.

Si no está utilizando ThreeState, CheckedChanged es todo lo que necesita.

-2

CheckState se dispara antes de confirmar el nuevo valor. CheckStateChanged se activa después de que se haya confirmado el nuevo valor.

Si buscas conjuntos de datos.hay cambios para hacer una actualización después de una modificación en el valor de la casilla de verificación, debes usar el evento checkstatechanged. Solo asegúrese de deshabilitar threestate para evitar problemas con NULL.

+1

Esto es falso, ambos eventos se activan después de que se haya cambiado el valor. –

1

Por lo que yo puedo decir:

CheckChanged se activa antes de que se cambie el valor comprobado, por lo .Checked declaraciones de lo que fue el valor,

CheckStateChanged se dispara después de cambiar el valor comprobado, por lo .Checked retornos cuál es el valor ES

+1

Esto es falso, ambos eventos se activan después de que el valor ha sido cambiado. –

4

Los dos eventos son efectivamente iguales a menos que establezca la propiedad ThreeState en true. Sin haber establecido ThreeState, ambos se activarán cuando la casilla de verificación esté marcada o desmarcada y ambos se activarán después de el valor ha cambiado.

La principal diferencia es cuando usted configura ThreeState true, lo cual se suma la IndeterminateCheckState:

  • El control considera Indeterminate a ser "controlada". (Checked == true).
  • La transición entre Checked y Unchecked es la misma que antes.
  • La transición entre Checked y Indeterminate hace no desencadenar el evento CheckedChanged, porque Checked estancias true.
  • La transición entre Unchecked y Indeterminatehace desencadenar el evento CheckedChanged, debido a los cambios de Checkedfalse a true o viceversa.
  • Al hacer clic en una casilla de verificación de tres estados, los estados pasan de Unchecked a Checked a Indeterminate y luego a Unchecked.Todavía puede realizar la transición de Unchecked a Indeterminate mediante programación.

(Tenga en cuenta la diferencia entre la propiedad Checked, que es una propiedad booleana dos estados, y el estado Checked, que es uno de los tres valores posibles de la propiedad CheckState.)

TL; DR: La principal diferencia práctica es que el evento CheckedChanged no se activa en una casilla de verificación de tres estados al pasar de CheckState.Checked a CheckState.Indeterminate o viceversa, porque se considera que ambos estados están marcados (Checked == true).

Cuestiones relacionadas