Windows C#CheckedListBox检查项目事件处理

我目前正在开发一个Window应用程序,它使用CheckedListBoxes来实现程序的某些方面。 我遇到的一个问题是,我一直在尝试查找在检查项目时触发了哪个事件,这样我就可以在选中任何列表项时启用表单按钮。

问题是我尝试使用以下内容;

private void clbAvailMods_ItemCheck(object sender, ItemCheckEventArgs e) { if(e.NewValue == CheckState.Checked) { btnInstall.Enabled = true; } } 

但是当我在if语句上设置断点时,它永远不会在检查列表框中的项目时触发。

我在这里做错了吗?

标准的Windows Forms技巧是延迟运行代码,直到所有事件副作用都完成。 您使用Control.BeginInvoke()方法延迟运行代码。 这将解决您的问题:

  private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e) { this.BeginInvoke(new MethodInvoker(evalList), null); } private void evalList() { bool any = false; for (int ix = 0; ix < checkedListBox1.Items.Count; ++ix) { if (checkedListBox1.GetItemChecked(ix)) { any = true; break; } } btnInstall.Enabled = any; } 

您可以使用NewValue属性手动更新CheckedItems.Count。 这是我用来仅在检查至少一个项目时启用按钮的代码:

 private void checkedListBoxProds_ItemCheck(object sender, ItemCheckEventArgs e) { this.buttonGenerar.Enabled = ((this.checkedListBoxProds.CheckedItems.Count + (e.NewValue == CheckState.Checked ? 1 : -1)) > 0); } 

一些潜在的陷阱。 据推测,您已经通过VS.Net GUI添加了事件,以确保它被连接到控件中。 尝试两次单击项目 – 一次为项目焦点,再次切换检查状态 – 如果您希望项目在第一次单击时切换其检查状态,则将“CheckOnClick”属性设置为true。

我认为这是SelectedIndexChanged事件,但我现在会确认。

编辑:SelectedIndexChanged事件确实有效。 但无论是否选中了复选框,都会触发。 因此,如果你想这样做,我会检查检查状态。

但是,当我确实使用了ItemCheck事件时,当我实际检查复选框而不仅仅是文本时,它确实触发了。

我知道很久以前就已经回答了这个问题,但我发现只处理MouseUp和KeyUp事件更容易。 触发这些事件时,CheckedItems.Count属性是准确的。 由于它们都做同样的事情,我创建了一个方法来处理工作并从两个事件处理程序调用该方法。

 private void clbFolders_KeyUp(object sender, KeyEventArgs e) { Update(); } private void clbFolders_MouseUp(object sender, MouseEventArgs e) { Update(); } private void Update() { btnDelete.Enabled = clbFolders.CheckedItems.Count > 0; }