c#仅在文本框中填写所有字段时启用按钮

时间:2015-09-23 18:34:27

标签: c# textbox

我非常困在这里,我需要帮助。 我的表单中有很多文本框,有些是可见的,有些是看不见的。

我希望只有当所有文本框(未隐藏)都不为空(至少一个字符或数字)时,Button2才会处于活动状态

我看到各种代码,但我无法弄清楚如何做到这一点。 (而且它不适合我)

例如,这里是我尝试过的代码,但它没有用完。

 bool invalid = this.Controls.OfType<TextBox>()
         .Where(t => t.Visible)
          .Any(t => string.IsNullOrWhiteSpace(t.Text));

        if (invalid)
            button2.Enabled = false;

如果有可能,我还想要解释。

谢谢!

2 个答案:

答案 0 :(得分:0)

一种递归方法,它遍历表单上的所有控件并查找可见/启用的文本框,这是我如何做到的:

private void AreControlsValid(Control.ControlCollection controls)
{   
    foreach (Control c in controls)
    {
        if (c is Textbox && c.Visible)
        {
            if (String.IsNullOrEmpty(((Textbox)c).Text))
                return false;
        }

       if (c.HasChildren)
           AreControlsValid(c.Controls);
    }

    return true;
}

*没有测试,这是我在另一个帖子中发布的答案的改编:Ability to find WinForm control via the Tag property

编辑:您可能还想要一个所有文本框订阅的通用事件:

textbox_TextChanged(object sender, EventArgs e)
{
    button2.Enabled = AreControlsValid(this.Controls);
}

正如史蒂夫在评论中提到的那样,MyForm.Controls的问题在于它只会在您的表单上获得直接的子控件,而不会让这些孩子的孩子受到影响。因此,如果您有一个带有文本框的分组框的表单,MyForm.Controls将为您提供分组框,而不是文本框。这就是我的递归的原因;它一路走下去。

答案 1 :(得分:0)

好吧,我会用这个程序来设置按钮的可用性(想象一下只有三个文本框):

private void SetButton()
{
    button2.Enabled = (textBox1.Text != "" || textBox1.Visible == false) && (textBox2.Text != "" || textBox2.Visible == false) && (textBox3.Text != "" || textBox3.Visible == false);
}

对于每个文本框,如果文本框已填充或不可见,则返回true布尔值。为了确保它立即生效,我将双击设计器文件中的每个文本框以获取“textBox(number)_TextChanged”事件处理程序,然后调用我刚刚创建的过程。例如:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    SetButton();
}

希望这有助于^ _ ^

相关问题