Установите флажок все и установите флажок список


У меня есть форма, которая содержит два элемента: a CheckedListBox и A CheckBox. CheckBox, который называется SelectAllCheckBox, используется для проверки/снятия всех элементов в CheckedListBox. Я достигаю этого с помощью обработчика событий CheckedChanged, связанного с SelectAllCheckBox, так что при его проверке проверяются все элементы в CheckedListBox, и наоборот. Это прекрасно работает.

У меня также есть код, который снимает флажок SelectAllCheckBox, когда пользователь снимает один из флажков в CheckedListBox. Например, если пользователь проверяет SelectAllCheckBox, а затем снимает один флажок из элементов, выберите Все CheckBox должны быть сняты флажки. Это достигается с помощью обработчика событий CheckedListBox.ItemChecked. Это тоже прекрасно работает.

Моя проблема заключается в том, что когда SelectAllCheckBox программно не отмечен (как в приведенном выше сценарии), его обработчик событий вызывает все элементы в CheckedListBox, чтобы стать непроверенным.

Я уверен, что другие столкнулись с моей проблемой; есть ли элегантный обходной путь?

2 2

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 {
     //....
   }
}