【问题标题】:How to bind the Enabled property of a button in Winforms to the CheckedItems.Count property of a CheckedListBox如何将 Winforms 中按钮的 Enabled 属性绑定到 CheckedListBox 的 CheckedItems.Count 属性
【发布时间】:2015-12-29 20:01:35
【问题描述】:

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

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

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

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

有什么建议吗?

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

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

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

【问题讨论】:

  • 你的代码“不工作”具体如何?
  • 你观察到什么行为?
  • 我刚刚编辑了我的帖子。

标签: c# winforms checked checkedlistbox


【解决方案1】:

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

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

【讨论】:

  • 它甚至适用于 Click 事件。谢谢。我必须进行明确的转换: BeginInvoke((Action)(() => { btnEdit.Enabled = btnDelete.Enabled = (clbEmailsS​​ubjects.CheckedItems.Count == 1); }));
  • 我认为你评论的最后一部分被吃掉了。但是我添加了对MethodInvoker 的显式转换,我认为这就是您所指的。
  • 好的,我将 MethodInvoker 更改为 Action 以匹配您的评论。两者都应该工作。
【解决方案2】:

您需要在您的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);
    }

【讨论】:

    猜你喜欢
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2011-01-19
    • 2013-08-25
    • 1970-01-01
    • 2010-12-21
    相关资源
    最近更新 更多