我正在使用以下代码将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);
}
}
答案 0 :(得分:2)
您可以创建一个新变量,指示何时应忽略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;
}
}
答案 1 :(得分:2)
这应该清除所有选中的项目:
public void UncheckCheckBoxItems(CheckBoxList cbl)
{
foreach (ListItem item in cbl.Items)
{
item.Selected = false;
}
}
答案 2 :(得分:1)
最简单的方法是断开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很重要,因为如果出现异常,您的事件处理程序将重新连接。