.net - shown - private sub form1_load
CheckBox de Windows Forms CheckedChanged vs. CheckStateChanged (5)
CheckState (y, por tanto, CheckStateChanged) permite el uso de una casilla de verificación que puede tener tres valores: se puede marcar, desmarcar o ''indeterminado'', es decir, tiene ThreeState establecido en verdadero.
Si no está utilizando ThreeState, CheckedChanged es todo lo que necesita.
El control CheckBox
Windows Forms implementa eventos CheckedChanged
y CheckStateChanged
. Por lo que puedo decir, ambos disparan cuando se cambia el estado marcado de la casilla de verificación.
CheckedChanged
precede a CheckStateChanged
, pero aparte de eso, no veo diferencia. ¿Me estoy perdiendo de algo? ¿Debería uno ser preferido sobre otro?
CheckState se dispara antes de que se confirme el nuevo valor. CheckStateChanged se dispara después de que se haya confirmado el nuevo valor.
Si busca un conjunto de datos. Cambia para hacer una actualización después de una modificación en el valor de la casilla de verificación, debe usar el evento checkstatechanged. Solo asegúrese de deshabilitar threestate para evitar problemas con NULL.
Los dos eventos son efectivamente iguales a menos que establezca la propiedad ThreeState
en true
. Sin haber configurado ThreeState
, ambos se activarán cuando la casilla de verificación esté marcada o desmarcada y ambos se activarán después de que el valor haya cambiado.
La principal diferencia es cuando establece ThreeState
en true, que agrega el estado de cuenta Indeterminate
:
- El control considera
Indeterminate
como "verificado". (Checked == true
). - La transición entre
Checked
yUnchecked
es la misma que antes. - La transición entre
Checked
eIndeterminate
noCheckedChanged
eventoCheckedChanged
, porqueChecked
mantienetrue
. - La transición entre
Unchecked
eIndeterminate
CheckedChanged
eventoCheckedChanged
, porqueChecked
cambia defalse
atrue
o viceversa. - Al hacer clic en una casilla de verificación de tres estados, los estados pasan de
Unchecked
aChecked
aIndeterminate
y de nuevo aUnchecked
. Aún puede pasar deUnchecked
aIndeterminate
programáticamente.
(Tenga en cuenta la diferencia entre la propiedad Checked
, que es una propiedad booleana de 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 CheckedChanged
en una casilla de verificación de tres estados cuando hace la transición de CheckState.Checked
en CheckState.Indeterminate
o viceversa, porque se considera que ambos estados están CheckState.Indeterminate
( Checked == true
)
Por lo que yo puedo decir:
CheckChanged
se CheckChanged
ANTES de que se cambie el valor verificado, por lo que. .Checked
devuelve el valor WAS,
CheckStateChanged
se CheckStateChanged
DESPUÉS de que se cambie el valor verificado, por lo que. .Checked
devuelve el valor ES
Supongo que tiene que ver con casillas de verificación tri-estatales. Estas son las entrañas 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);
}