为什么这段代码在启用后没有禁用我的按钮?

时间:2015-11-14 13:42:32

标签: c# selectedindexchanged oncheckedchanged

我在Windows窗体上有一个启动禁用的按钮(启用= false)。

我想在用户从组合框中选择一个项目时启用它,并检查CheckedListBox中的至少一个项目。用户可以通过复选框检查/取消选中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中的所有项目,它将不会再次禁用。为什么不呢?

1 个答案:

答案 0 :(得分:1)

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

您可以使用以下内容替换MonthAndMemberSelected中的支票:

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

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

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