关于 c#:Checked List Box Item Check Event 奇怪行为

Checked List Box Item Check Event Strange Behavior

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
6
7
8
9
10
11
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    if (checkedListBox1.GetItemChecked(i) == false)
    {
        ...
    }
    else
    {
        ...
    }
}

由于某种原因,当上面的代码执行时,它的作用与我希望它做的相反。当一个项目第一次被选中时,它不会做任何事情,然而,当它被取消选中时,它会做 else 语句中的事情(同样,与它应该做的事情相反)。是否有一些我在这里忘记的财产?


您应该使用 e.NewValue 而不是 checkedListBox1.GetItemChecked(i)。原因是 checkedListBox1.GetItemChecked 是缓存状态,因为 ItemCheck 事件发生在内部值更新之前。

这将按您的预期工作:

1
2
3
4
5
6
7
8
9
10
11
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    if (e.NewValue == CheckState.Checked)
    {
        ...
    }
    else
    {
        ...
    }
}

其次,至于为什么第一次单击复选框时,它没有反应:那是因为 CheckedListBox 对象要求在通过鼠标单击更改复选框值之前突出显示该项目。

为了达到类似的效果,设置checkedListBox1.CheckOnClick = true。这将导致在单击复选框或列表项本身时选中复选框。


MSDN 表明检查状态在 ItemCheck 事件中直到完成后才更新。您可能正在寻找 e.NewValue.