C# 如何将Winforms中按钮的Enabled属性绑定到CheckedListBox的CheckedItems.Count属性

C# 如何将Winforms中按钮的Enabled属性绑定到CheckedListBox的CheckedItems.Count属性,c#,winforms,checked,checkedlistbox,C#,Winforms,Checked,Checkedlistbox,我在表单中有一个CheckedListBox。每个项目代表登录用户的电子邮件主题 我试图实现的是,当仅选择一个项目时,应同时启用编辑和删除按钮,否则禁用 在将CheckOnClick属性设置为true后,我尝试使用以下事件处理程序,但它不起作用: private void clbEmailsSubjects_Click(object sender, EventArgs e) { btnEdit.Enabled = btnDelete.Enabled = (clbEmailsSubjec

我在表单中有一个CheckedListBox。每个项目代表登录用户的电子邮件主题

我试图实现的是,当仅选择一个项目时,应同时启用编辑和删除按钮,否则禁用

在将CheckOnClick属性设置为true后,我尝试使用以下事件处理程序,但它不起作用:

private void clbEmailsSubjects_Click(object sender, EventArgs e)
{
    btnEdit.Enabled = btnDelete.Enabled = (clbEmailsSubjects.CheckedItems.Count == 1);
}
有什么建议吗

编辑: 我选择了一个项目,但两个按钮仍处于禁用状态

现在,在选择第二项后,它们已启用:


效果似乎相反。我认为CheckedItems.Count的值可能会在事件处理程序执行后更新。

使用
ItemCheck
事件比
Click
事件更正确(因为单击可能没有落在复选框上)。但是无论哪种方式,事件都会在
复选框
上的
Checked
属性更改之前触发,因此您无法在这些事件处理程序中设置启用状态。但是,您可以推迟处理,直到使用
BeginInvoke
处理事件,如下所示:

private void clbEmailsSubjects_ItemCheck(object sender, ItemCheckEventArgs e)
{
    BeginInvoke((Action)(() =>
    {
        btnEdit.Enabled = btnDelete.Enabled =
            (clbEmailsSubjects.CheckedItems.Count == 1);
    }));
}

使用
ItemCheck
事件比使用
Click
事件更正确(因为单击可能没有落在复选框上)。但是无论哪种方式,事件都会在
复选框
上的
Checked
属性更改之前触发,因此您无法在这些事件处理程序中设置启用状态。但是,您可以推迟处理,直到使用
BeginInvoke
处理事件,如下所示:

private void clbEmailsSubjects_ItemCheck(object sender, ItemCheckEventArgs e)
{
    BeginInvoke((Action)(() =>
    {
        btnEdit.Enabled = btnDelete.Enabled =
            (clbEmailsSubjects.CheckedItems.Count == 1);
    }));
}

您需要在
CheckedListBox
上注册
ItemCheck
事件。然后,以下代码将为您提供所需的结果:

    private void clbEmailsSubjects_ItemCheck(object sender, ItemCheckEventArgs e)
    {
        btnEdit.Enabled = btnDelete.Enabled =
            (clbEmailsSubjects.CheckedItems.Count == 2 && e.NewValue == CheckState.Unchecked) ||
            (clbEmailsSubjects.CheckedItems.Count == 0 && e.NewValue == CheckState.Checked);
    }

您需要在
CheckedListBox
上注册
ItemCheck
事件。然后,以下代码将为您提供所需的结果:

    private void clbEmailsSubjects_ItemCheck(object sender, ItemCheckEventArgs e)
    {
        btnEdit.Enabled = btnDelete.Enabled =
            (clbEmailsSubjects.CheckedItems.Count == 2 && e.NewValue == CheckState.Unchecked) ||
            (clbEmailsSubjects.CheckedItems.Count == 0 && e.NewValue == CheckState.Checked);
    }

你的代码“不工作”的具体程度如何?你观察到了什么行为?我刚刚编辑了我的帖子。你的代码“不工作”的具体程度如何?你观察到了什么行为?我刚刚编辑了我的帖子。它甚至可以与点击事件一起工作。谢谢但我必须进行显式转换:BeginInvoke((操作)(()=>{btnEdit.Enabled=btnDelete.Enabled=(clbemailsobjects.CheckedItems.Count==1);});我想你评论的最后一部分被吃掉了。但是我添加了一个到
MethodInvoker
的显式转换,我想这就是您所指的。好的,我将
MethodInvoker
更改为
Action
,以匹配您的注释。这两种方法都应该有效。它甚至可以用于单击事件。谢谢但我必须进行显式转换:BeginInvoke((操作)(()=>{btnEdit.Enabled=btnDelete.Enabled=(clbemailsobjects.CheckedItems.Count==1);});我想你评论的最后一部分被吃掉了。但是我添加了一个到
MethodInvoker
的显式转换,我想这就是您所指的。好的,我将
MethodInvoker
更改为
Action
,以匹配您的注释。两者都应该有效。