我的表单包含两个元素:CheckedListBox
和CheckBox
。 CheckBox
被称为SelectAllCheckBox
,用于检查/取消选中CheckedListBox
中的所有项目。我通过与CheckedChanged
关联的SelectAllCheckBox
事件处理程序实现此目的,因此在检查时,CheckedListBox
中的所有项都会被检查,反之亦然。这很好。
当用户取消选中SelectAllCheckBox
中的一个CheckBox时,我还有代码取消选中CheckedListBox
。例如,如果用户选中SelectAllCheckBox
,然后取消选中其中一个项目,则应取消选中全选CheckBox
。这是通过CheckedListBox.ItemChecked
事件处理程序实现的。这也很好。
我的问题是,当SelectAllCheckBox
以编程方式取消选中时(如上例所示),其事件处理程序会导致CheckedListBox
中的所有项目都未选中。
我确信其他人已经遇到了我的问题;有优雅的解决方法吗?
答案 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;
另一种方法是你可以尝试其他类型的事件,例如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 {
//....
}
}
答案 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标志(除非您在某处手动更改焦点状态)。