选择All Checkbox和CheckedListBox

时间:2013-08-20 16:09:49

标签: c# .net winforms checkedlistbox

我的表单包含两个元素:CheckedListBoxCheckBoxCheckBox被称为SelectAllCheckBox,用于检查/取消选中CheckedListBox中的所有项目。我通过与CheckedChanged关联的SelectAllCheckBox事件处理程序实现此目的,因此在检查时,CheckedListBox中的所有项都会被检查,反之亦然。这很好。

当用户取消选中SelectAllCheckBox中的一个CheckBox时,我还有代码取消选中CheckedListBox。例如,如果用户选中SelectAllCheckBox,然后取消选中其中一个项目,则应取消选中全选CheckBox。这是通过CheckedListBox.ItemChecked事件处理程序实现的。这也很好。

我的问题是,当SelectAllCheckBox以编程方式取消选中时(如上例所示),其事件处理程序会导致CheckedListBox中的所有项目都未选中。

我确信其他人已经遇到了我的问题;有优雅的解决方法吗?

2 个答案:

答案 0 :(得分:2)

你可以使用一些标志:

 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;

另一种方法是你可以尝试其他类型的事件,例如ClickDoubleClick(必须同时使用):

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

答案 1 :(得分:2)

另一种方法是利用以下事实:当您以编程方式选中/取消选中时,它不会将焦点放在复选框上。因此,您可以使用Focused属性作为标记。

private void SelectAllCheckBox_CheckedChanged(object sender, EventArgs e)
{
    if(!((CheckBox)sender).Focused) 
       return;
    //your code to uncheck/check all CheckedListBox here
}

无需创建另一个单独的bool标志(除非您在某处手动更改焦点状态)。