为什么此代码在启用后不禁用我的按钮?
Why is this code not disabling my button after it has been enabled?
我在 Windows 表单上有一个按钮开始禁用(启用 = false)。
我想在用户从组合框中选择一项并至少选中 CheckedListBox 中的一项时启用它。用户可以通过复选框 check/uncheck 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 中的所有项目,它就不会再次禁用。为什么不呢?
如评论中所述,我认为一个问题是您正在检查 checkedItemBox
的选定索引,而不是验证没有检查任何项目。
您可以将 MonthAndMemberSelected
中的检查替换为类似以下内容:
return ((comboBoxMonth.SelectedIndex >= 0)
&& (MemberListBox.CheckedItems.Count > 0));
假设 MemberListBox
是您选中的项目框。这将验证当前至少选中了一项。
这可能会解决您眼前的问题,但从长远来看,您可能需要考虑将验证逻辑与 UI 分离,因为如果有更多字段相互依赖,它会变得非常复杂(如果这是一个快速解决问题的小工具,可能不值得。
我在 Windows 表单上有一个按钮开始禁用(启用 = false)。
我想在用户从组合框中选择一项并至少选中 CheckedListBox 中的一项时启用它。用户可以通过复选框 check/uncheck 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 中的所有项目,它就不会再次禁用。为什么不呢?
如评论中所述,我认为一个问题是您正在检查 checkedItemBox
的选定索引,而不是验证没有检查任何项目。
您可以将 MonthAndMemberSelected
中的检查替换为类似以下内容:
return ((comboBoxMonth.SelectedIndex >= 0)
&& (MemberListBox.CheckedItems.Count > 0));
假设 MemberListBox
是您选中的项目框。这将验证当前至少选中了一项。
这可能会解决您眼前的问题,但从长远来看,您可能需要考虑将验证逻辑与 UI 分离,因为如果有更多字段相互依赖,它会变得非常复杂(如果这是一个快速解决问题的小工具,可能不值得。