如果未选中已选中的复选框,我想删除该项目。问题是检查/取消检查似乎是在调用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;
}
}
感谢您的帮助
答案 0 :(得分:3)
听起来你遇到的唯一问题就是在删除最后一项后调用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;
}
}
}
<强>更新强>
好的 - 我得到了它的工作,虽然我不确定它有多漂亮。我使用了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);
}
}
我在VS 2010中对此进行了测试,但它确实有效。