C#禁用按钮,除非至少检查了多于1个项目

时间:2011-02-07 18:13:40

标签: c# validation checkbox

有一个包含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;
        }
    }

认为这样可行,但按钮从一开始就启用,当选中任何复选框时,该按钮将永久禁用。

6 个答案:

答案 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:)