只有当文本框中所有字段都被填满时,c#才启用按钮

本文关键字:满时 按钮 启用 文本 字段 | 更新日期: 2023-09-27 18:14:19

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

我想Button2将被激活只有当所有的文本框(不隐藏)不是空的(至少一个字符或数字)

我看到了各种各样的代码,但我不知道怎么做。(这对我不起作用)

例如,这里有一个代码,我尝试过,但它没有工作。

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

如果可能的话,我也希望得到一个解释。

谢谢!

只有当文本框中所有字段都被填满时,c#才启用按钮

那么,我将使用这个过程来设置按钮的可用性(假设只有三个文本框):

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

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

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

希望能有所帮助^_^

递归方法遍历表单上的所有控件并查找可见/启用的文本框,这就是我要做的:

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;
}

*没有测试,这是一个答案的改编我张贴在另一个线程:能够找到WinForm控件通过标签属性

edit:此外,您可能还需要一个通用事件,所有文本框都可以订阅:

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

正如Steve在评论中提到的,MyForm.Controls的问题是它只能在表单上直接获得子控件,而不能获得这些子控件的子控件。如果你有一个带有组框和文本框的表单,MyForm.Controls会给你组框而不是文本框。这就是为什么我的是递归的;