管理CheckedListBox ItemCheck事件以在之前检查的项目之后运行

mos*_*her 4 .net c# checkedlistbox winforms

CheckedListBox在C#Window Forms Application中使用.

我想在检查或取消选中一个项目后执行某些操作,但ItemCheck事件在项目选中/取消选中之前运行.我怎样才能做到这一点?

Rez*_*aei 13

CheckedListBox.ItemCheck事件

在ItemCheck事件发生之前,检查状态不会更新.

要在选中项目后运行某些代码,您应该使用解决方法.

最佳选择

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

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    this.BeginInvoke(new Action(() =>
    {
        //Do the after check tasks here
    }));
}
Run Code Online (Sandbox Code Playgroud)

另外一个选项

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

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

使用代码:

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
Run Code Online (Sandbox Code Playgroud)

另外一个选项

在ItemCheck事件的中间,删除ItemCheck,SetItemCheckState的处理程序,然后添加处理程序egain.

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      
}
Run Code Online (Sandbox Code Playgroud)