Sim*_*Cat 3 c# checkedlistbox winforms
当取消选中选中的框时,我想删除该项目。问题是检查/取消检查似乎是在调用 ItemCheck 方法之后发生的。因此,当我删除一个弄乱 e.Index 的项目时,它会在我删除的项目之后检查/取消选中该项目,或者如果它是最后一个项目,则会抛出错误。
我发现了这个:Getting the ListView ItemCheck to stop! 其中有重置 e.NewValue 的提示,该部分可以正常工作,但当我删除最后一项时,它仍然会引发错误。
我没有简单地使用其中一个鼠标事件的原因是我希望键盘导航仍然可以以防万一。
这是我现在的代码。
private void checked_ItemCheck(object sender, ItemCheckEventArgs e)
{
if (e.NewValue == CheckState.Unchecked)
{
checked.Items.RemoveAt(e.Index);
e.NewValue = CheckState.Checked;
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助
听起来您仍然遇到的唯一问题是e.NewValue删除最后一个项目后的调用,对吧?如果是这种情况,请尝试以下操作:
private void checked_ItemCheck(object sender, ItemCheckEventArgs e)
{
if (e.NewValue == CheckState.Unchecked)
{
checked.Items.RemoveAt(e.Index);
// If there are no items left, skip the CheckState.Checked call
if (checked.Items.Count > 0)
{
e.NewValue = CheckState.Checked;
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新
好的 - 我让它工作了,尽管我不确定它有多漂亮。我使用了 SelectedIndexChanged 事件:
private void checked_SelectedIndexChanged(object sender, EventArgs e)
{
CheckedListBox clb = (CheckedListBox)sender;
int index = clb.SelectedIndex;
// When you remove an item from the Items collection, it fires the SelectedIndexChanged
// event again, with SelectedIndex = -1. Hence the check for index != -1 first,
// to prevent an invalid selectedindex error
if (index != -1 && clb.GetItemCheckState(index) == CheckState.Unchecked)
{
clb.Items.RemoveAt(index);
}
}
Run Code Online (Sandbox Code Playgroud)
我已经在 VS 2010 中测试过它并且有效。