我非常困在这里,我需要帮助。 我的表单中有很多文本框,有些是可见的,有些是看不见的。
我希望只有当所有文本框(未隐藏)都不为空(至少一个字符或数字)时,Button2才会处于活动状态
我看到各种代码,但我无法弄清楚如何做到这一点。 (而且它不适合我)
例如,这里是我尝试过的代码,但它没有用完。
bool invalid = this.Controls.OfType<TextBox>()
.Where(t => t.Visible)
.Any(t => string.IsNullOrWhiteSpace(t.Text));
if (invalid)
button2.Enabled = false;
如果有可能,我还想要解释。
谢谢!
答案 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();
}
希望这有助于^ _ ^