关于 c#:Manage CheckedListBox ItemCheck 事件在检查项目之后运行而不是之前

Manage CheckedListBox ItemCheck event to run after an item checked not before

我在 C# 窗口窗体应用程序中使用 CheckedListBox

我想在选中或未选中一个项目之后做某事,但 ItemCheck 事件在项目选中/未选中之前运行。
我该怎么做?


CheckedListBox.ItemCheck Event

The check state is not updated until after the ItemCheck event occurs.

要在检查项目后运行一些代码,您应该使用解决方法。

最佳选择

您可以使用此选项(感谢 Hans Passant 的这篇文章):

1
2
3
4
5
6
7
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    this.BeginInvoke(new Action(() =>
    {
        //Do the after check tasks here
    }));
}

另一种选择

  • 如果在ItemCheck事件的中间,你需要知道item的状态,你应该使用e.NewValue而不是使用checkedListBox1.GetItemChecked(i)

  • 如果您需要将检查索引列表传递给方法,请执行以下操作:

使用代码:

1
2
3
4
5
6
7
8
9
10
var checkedIndices = this.checkedListBox1.CheckedIndices.Cast<int>().ToList();
if (e.NewValue == CheckState.Checked)
    checkedIndices.Add(e.Index);
else
    if(checkedIndices.Contains(e.Index))
        checkedIndices.Remove(e.Index);

 //now you can do what you need to checkedIndices
 //Here if after check but you should use the local variable checkedIndices
 //to find checked indices

另一个选项

在ItemCheck事件的中间,移除ItemCheck的handler,SetItemCheckState,然后添加handler egain。

1
2
3
4
5
6
7
8
9
10
11
12
13
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    var control = (CheckedListBox)sender;
    // Remove handler
    control.ItemCheck -= checkedListBox_ItemCheck;

    control.SetItemCheckState(e.Index, e.NewValue);

    // Add handler again
    control.ItemCheck += checkedListBox_ItemCheck;

    //Here is After Check, do additional stuff here      
}

尝试更多地寻找答案,因为这里是

1
2
3
4
5
6
7
8
9
10
11
12
    private void clbOrg_ItemCheck(object sender, ItemCheckEventArgs e)
{
    CheckedListBox clb = (CheckedListBox)sender;
    // Switch off event handler
    clb.ItemCheck -= clbOrg_ItemCheck;
    clb.SetItemCheckState(e.Index, e.NewValue);
    // Switch on event handler
    clb.ItemCheck += clbOrg_ItemCheck;

    // Now you can go further
    CallExternalRoutine();        
}

还有链接:
检查项目后会触发哪个 CheckedListBox 事件?


您可以在 ItemCheck 上连接一个事件。您可以通过右键单击复选框列表并选择属性来完成。在右侧您将看到属性选项卡,单击事件选项卡按钮并找到 ItemCheck 事件并双击它。它将根据您的复选框列表名称为您生成一个事件方法,如下所示。

然后,您可以使用下面的代码验证选中/选中的复选框。

1
2
3
4
5
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    var checkBoxName = checkedListBox1.Items[e.Index];
    Console.WriteLine("Current {0}, New {1} , value {2}", e.CurrentValue, e.NewValue, checkBoxName);
}