我使用以下代码将CheckedListBox中的选中项数限制为1:
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 事件处理程序的连接,执行取消选中,然后重新连接事件处理程序。这样,当您调用 SetItemCheck 时,不会触发任何 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 很重要,因为在出现异常时,您的事件处理程序将被重新连接。