只有当文本框中所有字段都被填满时,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;
如果可能的话,我也希望得到一个解释。
谢谢!
那么,我将使用这个过程来设置按钮的可用性(假设只有三个文本框):
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
会给你组框而不是文本框。这就是为什么我的是递归的;