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

我在C#Window Forms Application中使用CheckedListBox

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

CheckedListBox.ItemCheck事件

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

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

最佳选择

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

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

另外一个选项

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

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

使用代码:

 var checkedIndices = this.checkedListBox1.CheckedIndices.Cast().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,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 } 

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

  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事件并双击它。 它将为您生成一个事件方法,具体取决于您的checkboxlist名称,如下所示。

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

 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); }