Установите флажок все и установите флажок список
У меня есть форма, которая содержит два элемента: 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 { //.... } }