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 |
另一个选项
在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 //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 |
还有链接:
检查项目后会触发哪个 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); } |
- 我明白您的观点,CheckedListBox 在检查后不支持事件,但上述解决方案或更确切地说是 ItemCheck 事件将在您选中复选框列表中的复选框并且选中的复选框 e.Value 将在事件后立即提交完成的。我认为 ItemCheck 事件已经足以满足他的要求,不是吗?
来源:https://www.codenong.com/32291324/