C# ItemChecked事件处理程序
我使用以下代码将CheckedListBox中的选中项目数限制为1:C# ItemChecked事件处理程序,c#,events,checkedlistbox,C#,Events,Checkedlistbox,我使用以下代码将CheckedListBox中的选中项目数限制为1: private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) { if (checkedListBox1.CheckedItems.Count == 1) { Boolean isCheckedItemBeingUnchecked = (e.CurrentVa
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
if (checkedListBox1.CheckedItems.Count == 1)
{
Boolean isCheckedItemBeingUnchecked = (e.CurrentValue == CheckState.Checked);
if (isCheckedItemBeingUnchecked)
{
e.NewValue = CheckState.Checked;
}
else
{
Int32 checkedItemIndex = checkedListBox1.CheckedIndices[0];
checkedListBox1.ItemCheck -= checkedListBox1_ItemCheck;
checkedListBox1.SetItemChecked(checkedItemIndex, false);
checkedListBox1.ItemCheck += checkedListBox1_ItemCheck;
}
return;
}
}
但有时我需要清除所有选中的项目。我正在使用下面的代码尝试这样做,但前面的事件阻止了它的工作。我怎样才能做到这一点?谢谢
public void ClearChecked()
{
foreach (int checkedItemIndex in checkedListBox1.CheckedIndices)
{
checkedListBox1.SetItemChecked(checkedItemIndex, false);
}
}
您可以创建一个新变量,指示何时应忽略ItemCheck事件:
private shouldIgnoreCheckEvent;
public void ClearChecked()
{
this.shouldIgnoreCheckEvent = true;
foreach (int checkedItemIndex in checkedListBox1.CheckedIndices)
{
checkedListBox1.SetItemChecked(checkedItemIndex, false);
}
this.shouldIgnoreCheckEvent = false;
}
并更新ItemCheck方法以检查是否应忽略它:
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
if (!this.shouldIgnoreCheckEvent && checkedListBox1.CheckedItems.Count == 1)
{
Boolean isCheckedItemBeingUnchecked = (e.CurrentValue == CheckState.Checked);
if (isCheckedItemBeingUnchecked)
{
e.NewValue = CheckState.Checked;
}
else
{
Int32 checkedItemIndex = checkedListBox1.CheckedIndices[0];
checkedListBox1.ItemCheck -= checkedListBox1_ItemCheck;
checkedListBox1.SetItemChecked(checkedItemIndex, false);
checkedListBox1.ItemCheck += checkedListBox1_ItemCheck;
}
return;
}
}
这将清除所有选中的项目:
public void UncheckCheckBoxItems(CheckBoxList cbl)
{
foreach (ListItem item in cbl.Items)
{
item.Selected = false;
}
}
最简单的方法是断开ItemChecked事件处理程序的连接,执行取消选中,然后重新连接事件处理程序。这样,当调用SetItemChecked时,不会触发ItemChecked事件,并且不需要任何额外的代码来控制事件处理程序。 刚刚注意到您已经在ItemCheck事件中使用了此模式
public void ClearChecked()
{
try
{
checkedListBox1.ItemCheck -= checkedListBox1_ItemCheck;
foreach (int checkedItemIndex in checkedListBox1.CheckedIndices)
{
checkedListBox1.SetItemChecked(checkedItemIndex, false);
}
}
finally
{
checkedListBox1.ItemCheck += checkedListBox1_ItemCheck;
}
}
try/finally很重要,因为如果出现异常,您的事件处理程序将重新连接。首先取消订阅事件,然后调用clear checked。或者创建一个实例变量,指示何时忽略item changed事件。我想知道为什么您不只是使用一个列表框,从中只能选择1个值…CheckBoxList!=CheckedListBox和WinForms!=WPF。