Установите флажок все и установите флажок список
У меня есть форма, которая содержит два элемента: a CheckedListBox
и A CheckBox
. CheckBox
, который называется SelectAllCheckBox
, используется для проверки/снятия всех элементов в CheckedListBox
. Я достигаю этого с помощью обработчика событий CheckedChanged
, связанного с SelectAllCheckBox
, так что при его проверке проверяются все элементы в CheckedListBox
, и наоборот. Это прекрасно работает.
У меня также есть код, который снимает флажок SelectAllCheckBox
, когда пользователь снимает один из флажков в CheckedListBox
. Например, если пользователь проверяет SelectAllCheckBox
, а затем снимает один флажок из элементов, выберите Все CheckBox
должны быть сняты флажки. Это достигается с помощью обработчика событий CheckedListBox.ItemChecked
. Это тоже прекрасно работает.
Моя проблема заключается в том, что когда SelectAllCheckBox
программно не отмечен (как в приведенном выше сценарии), его обработчик событий вызывает все элементы в CheckedListBox
, чтобы стать непроверенным.
Я уверен, что другие столкнулись с моей проблемой; есть ли элегантный обходной путь?
2 ответа:
Другой способ-использовать тот факт, что при программной проверке / снятии флажка он не фокусируется на флажке. Таким образом, вы можете использовать свойство
Focused
в качестве флага.private void SelectAllCheckBox_CheckedChanged(object sender, EventArgs e) { if(!((CheckBox)sender).Focused) return; //your code to uncheck/check all CheckedListBox here }
Нет необходимости создавать еще один отдельный флаг bool (если только вы не меняете состояние фокуса где-то вручную).
Вы можете использовать некоторый флаг:
bool suppressCheckedChanged; private void SelectAllCheckBox_CheckedChanged(object sender, EventArgs e){ if(suppressCheckedChanged) return; //your code here //.... } //Then whenever you want to programmatically change the Checked of your SelectAllCheckBox //you can do something like this suppressCheckedChanged = true; SelectAllCheckBox.Checked = false; suppressCheckedChanged = false;
Другой подход заключается в том, что вы можете попробовать другой вид события, например
Click
иDoubleClick
(должны использовать оба):private void SelectAllCheckBox_Click(object sender, EventArgs e){ DoStuff(); } private void SelectAllCheckBox_DoubleClick(object sender, EventArgs e){ DoStuff(); } private void DoStuff(){ //your code here; if(SelectAllCheckBox.Checked){ //.... } else { //.... } }