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

时间:2015-12-29 20:01:35

标签: c# winforms checked checkedlistbox

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

form

我尝试实现的是,当只选择一个项目时,应启用“编辑”和“删除”按钮,否则禁用。

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

private void clbEmailsSubjects_Click(object sender, EventArgs e)
{
    btnEdit.Enabled = btnDelete.Enabled = (clbEmailsSubjects.CheckedItems.Count == 1);
}

有什么建议吗?

编辑: 我选择了一个项目,但两个按钮仍然被禁用。

enter image description here

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

enter image description here

效果似乎相反。我认为在执行event_handler之后,CheckedItems.Count的值可能会更新。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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