2

当检查被选中的框未选中时,我想删除该项目。问题是在调用 ItemCheck 方法之后似乎发生了检查/取消检查。因此,当我删除一个弄乱 e.Index 的项目时,它会在我删除的项目之后检查/取消选中该项目,或者如果它是最后一个项目则会引发错误。

我发现了这个:让 ListView ItemCheck 停止!它具有重置部分有效的 e.NewValue 的提示,但是当我删除最后一项时它仍然会引发错误。

我没有简单地使用鼠标事件之一的原因是我希望键盘导航仍然可以以防万一。

这是我现在拥有的代码。

private void checked_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            if (e.NewValue == CheckState.Unchecked)
            {
                checked.Items.RemoveAt(e.Index);
                e.NewValue = CheckState.Checked;
            }
        }

谢谢您的帮助

4

1 回答 1

4

听起来您仍然遇到的唯一问题是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 中对此进行了测试,并且可以正常工作。

于 2011-08-02T22:39:54.030 回答