CheckedListBox中没有ItemChecked事件?

Reg*_*was 28 c# winforms

ListView控件有一个ItemCheck被触发的事件之前,该项目的变化,以及ItemChecked被解雇事件的项目变更.有关详细信息,请参阅此SO问题.

CheckedListBox控件只有ItemCheck事件.

使用CheckedListBox执行此类操作的最佳方法是什么?

private void checkedListBox_ItemChecked(object sender ItemCheckedEventArgs e)
{
    okButton.Enabled = (checkedListBox.CheckedItems.Count > 0);
}
Run Code Online (Sandbox Code Playgroud)

补充问题:为什么没有CheckedListBox.ItemChecked事件?

Han*_*ant 52

处理引发时无法处理的事件的一个很好的技巧是延迟处理.您可以使用Control.BeginInvoke()方法执行此操作,只要调度所有事件,副作用完成并且UI线程再次空闲,它就会运行.通常对TreeView有帮助,另一个胡思乱想的控件.

    private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) {
        this.BeginInvoke((MethodInvoker)delegate { 
            okButton.Enabled = checkedListBox1.CheckedItems.Count > 0;
        });
    }
Run Code Online (Sandbox Code Playgroud)

以防万一:这与线程无关,而且技巧相当便宜.

为什么没有ItemChecked事件?不太确定.CheckedListBox只是一个非常好的控件.绝对不是原始Winforms团队中的一位大师所做的.

  • 一个小小的障碍."在创建窗口句柄之前,无法在控件上调用BeginInvoke",我在显示表单之前通过checkedListBox1.SetItemChecked()设置状态,这会引发异常. (5认同)
  • 老鼠,你发现了一个漏洞。测试this.IsHandleCreated或将代码移至Load事件,或者在初始化项之前不要订阅该事件。我赞成Load事件(实际上是OnLoad)。 (2认同)
  • 每次被困,每次都落在这个答案上。我希望我每次都可以投票。 (2认同)