有一个包含3个复选框项和一个按钮的表单。除非在表格上检查了至少1个以上的项目,否则请禁用“完成”按钮。
private void btnFinish_Validating(object sender, CancelEventArgs e)
{
if ((checkBlinna.Checked == false && checkSoup.Checked == false) || (checkBlinna.Checked == false && checkGnocchi.Checked == false) || (checkSoup.Checked == false && checkGnocchi.Checked == false))
{
btnFinish.Enabled = false;
}
}
认为这样可行,但按钮从一开始就启用,当选中任何复选框时,该按钮将永久禁用。
答案 0 :(得分:4)
你可以这样做:
void UpdateFinishEnabled()
{
var boxes = new CheckBox[] { checkBlinna, checkSoup, checkGnocchi };
btnFinish.Enabled = boxes.Any(b => b.Checked);
}
在表单加载和验证处理程序内调用。
答案 1 :(得分:2)
我对你的逻辑感到困惑。这应该工作我认为
bthFinish.Enabled = checkBlinna.Checked || checkSoup.Checked || checkGnocchi.Checked;
答案 2 :(得分:2)
private void btnFinish_Validating(...)
这是一个问题,只有在btnFinish失去焦点时才会引发Validating事件。这不是很合适,因为当复选框控制更改状态时,应运行此代码。更糟糕的是,当按钮被禁用时,永远不会发生,因为这会阻止它获得焦点。这就是为什么你不能使它工作。您需要通过复选框控件'CheckedChanged事件处理程序的所有调用此代码。
作为替代方法,您还可以从Application.Idle事件运行这些状态更新方法。使您不必编写大量事件处理代码。但是要做一些不必要的工作。无关紧要,因为它很便宜并且在没有其他工作需要完成时运行。
public Form1() {
InitializeComponent();
Application.Idle += new EventHandler(Application_Idle);
}
void Application_Idle(object sender, EventArgs e) {
bthFinish.Enabled = checkBlinna.Checked || checkSoup.Checked || checkGnocchi.Checked;
}
答案 3 :(得分:0)
我建议你编写一个小帮手方法来启用/禁用按钮:
private bool AtLeastOneCheck()
{
return (checkBlinna.Checked || checkSoup.Checked || checkGnocchi.Checked);
}
然后,只要需要启用/禁用按钮,就可以调用此方法,例如,在CheckedChanged
事件处理程序中选中复选框:
btnFinish.Enabled = AtLeastOneCheck();
编辑:根据您的说明,如果您需要两次或更多次检查,您可以按如下方式修改辅助方法:
private int CountChecked()
{
CheckBox[] AllCheckboxes = { checkBlinna, checkSoup, checkGnocchi };
return AllCheckboxes.Count(cb => cb.Checked);
}
以稍微不同的方式实现它:
btnFinish.Enabled = CountChecked() >= 2;
答案 4 :(得分:0)
private void btnFinish_Validating(object sender, CancelEventArgs e)
{
btnFinish.Enabled = checkBlinna.Checked || checkSoup.Checked || checkGnocchi.Checked;
}
答案 5 :(得分:0)
我一直支持llia Jerebtsov解决方案,但是我的方法会略有不同,我会添加和CheckboxChanged事件,并将所有复选框绑定到复选框事件中的相同事件位置llia代码,如下所示:
private void CheckChanged(object sender, EventArgs e)
{
var boxes = new CheckBox[] { checkBlinna, checkSoup, checkGnocchi };
btnFinish.Enabled = boxes.Any(b => b.Checked);
}
然后它应该有希望地工作。希望有所帮助。感谢llia:)