2

我在 Windows 窗体上有一个按钮,该按钮开始时禁用(启用 = 假)。

我想在用户从组合框中选择一项并从 CheckedListBox 中检查至少一项时启用它。用户可以通过 Checkbox 选中/取消选中 CheckedListBox 中的所有项目,如下所示:

private void checkBoxAll_CheckedChanged(object sender, EventArgs e)
{
    for (int x = 0; x < MemberListBox.Items.Count; x++)
    {
        MemberListBox.SetItemChecked(x, checkBoxAll.Checked);
    }
    GenPacketBtn.Enabled = MonthAndMemberSelected();
}

所以,我认为这很容易 - 只需检查组合框和 CheckedListBox 中是否已选择某些内容:

private bool MonthAndMemberSelected()
{
    return ((comboBoxMonth.SelectedIndex >= 0) && (MemberListBox.SelectedIndex >= 0));
}

...然后在更改这些控件时启用或禁用按钮,如下所示:

private void comboBoxMonth_SelectedIndexChanged(object sender, EventArgs e)
{
    GenPacketBtn.Enabled = MonthAndMemberSelected();
}

private void MemberListBox_SelectedIndexChanged(object sender, EventArgs e)
{
    GenPacketBtn.Enabled = MonthAndMemberSelected();
}

由于复选框对 CheckedListBox 有很大影响,我将该代码添加到 checkBoxAll_CheckedChanged() 事件中:

private void checkBoxAll_CheckedChanged(object sender, EventArgs e)
{
    for (int x = 0; x < MemberListBox.Items.Count; x++)
    {
        MemberListBox.SetItemChecked(x, checkBoxAll.Checked);
    }
    GenPacketBtn.Enabled = MonthAndMemberSelected();
}

...并且(因为它没有工作,出于绝望)也对其 Clicked 事件:

private void checkBoxAll_Click(object sender, EventArgs e)
{
    GenPacketBtn.Enabled = MonthAndMemberSelected();
}

但它不起作用 - 启用按钮有效,但一旦启用,如果我取消选中 CheckedListBox 中的所有项目,它将不会再次禁用。为什么不?

4

1 回答 1

1

正如评论中提到的,我认为一个问题是您正在检查 的选定索引checkedItemBox,而不是验证没有检查任何项目。

您可以将签入替换为MonthAndMemberSelected以下内容:

return ((comboBoxMonth.SelectedIndex >= 0) 
    && (MemberListBox.CheckedItems.Count > 0));

假设MemberListBox是您选中的项目框。这将验证当前至少检查了一项。

这可能会解决您眼前的问题,但从长远来看,您可能需要考虑将验证逻辑与 UI 分离,因为如果还有其他相互依赖的字段可能会变得非常复杂(如果这是一个小问题,可能不值得快速解决问题的工具)。

于 2015-11-14T14:07:11.717 回答