如何将 Winforms 中按钮的启用 属性 绑定到 CheckedListBox 的 CheckedItems.Count 属性
How to bind the Enabled property of a button in Winforms to the CheckedItems.Count property of a CheckedListBox
我在表单中有一个 CheckedListBox。每个项目代表登录用户的电子邮件主题。
我试图实现的是,当只选择一个项目时,编辑和删除按钮都应该启用,否则禁用。
我在将 CheckOnClick 属性 设置为 true 后尝试使用以下事件处理程序,但它不起作用:
private void clbEmailsSubjects_Click(object sender, EventArgs e)
{
btnEdit.Enabled = btnDelete.Enabled = (clbEmailsSubjects.CheckedItems.Count == 1);
}
有什么建议吗?
编辑:
我已经选择了一个项目,但是两个按钮仍然被禁用。
现在,在选择第二个项目后,它们已启用:
效果好像适得其反。我认为 CheckedItems.Count 的值可能会在 event_handler 执行后更新。
使用 ItemCheck
事件比 Click
事件更正确(因为点击可能没有落在复选框上)。但无论哪种方式,事件都会在 CheckBox
上的 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。每个项目代表登录用户的电子邮件主题。
我试图实现的是,当只选择一个项目时,编辑和删除按钮都应该启用,否则禁用。
我在将 CheckOnClick 属性 设置为 true 后尝试使用以下事件处理程序,但它不起作用:
private void clbEmailsSubjects_Click(object sender, EventArgs e)
{
btnEdit.Enabled = btnDelete.Enabled = (clbEmailsSubjects.CheckedItems.Count == 1);
}
有什么建议吗?
编辑: 我已经选择了一个项目,但是两个按钮仍然被禁用。
现在,在选择第二个项目后,它们已启用:
效果好像适得其反。我认为 CheckedItems.Count 的值可能会在 event_handler 执行后更新。
使用 ItemCheck
事件比 Click
事件更正确(因为点击可能没有落在复选框上)。但无论哪种方式,事件都会在 CheckBox
上的 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);
}