我有一个Windows窗体,其中包含一些文本框和标签。在我的程序中,我将它们全部设置为不可见,当我按下按钮时,使用下面的代码可使所有标签和文本框可见,并且效果很好。
List<Label> lbls = this.Controls.OfType<Label>().ToList();
foreach (var lbl in lbls)
{
if (lbl.Name.StartsWith("label"))
{
lbl.Visible = true;
}
}
List<TextBox> txts = this.Controls.OfType<TextBox>().ToList();
foreach (var txt in txts)
{
if (txt.Name.StartsWith("textBox"))
{
txt.Visible = true;
}
}
但是当我将所有标签和文本框都放入groupbox时,我的代码不起作用。该怎么办?
注意:当我按下按钮时,我的分组框也不可见。
groupBox1.visible =true;
此代码有效,并且似乎可以使用“组框”面板,但是标签和文本框的代码不起作用。
答案 0 :(得分:3)
因为您在这里与Form的直系子孙一起工作
List<Label> lbls = this.Controls.OfType<Label>().ToList();
通知this
表示您当前的表格。因此,当您将控件放置在外部时,它就会起作用
但是,当您将它们放入组框时,它就不再是直子。
所以使用
List<Label> lbls = groupBox1.Controls.OfType<Label>().ToList();
这将使您可以访问组框的直接子级。
答案 1 :(得分:1)
最好创建自己的递归方法。尝试实现类似这样的方法:
private void MakeControlsInvisible(Control container, params Type[] controlTypes)
{
foreach (Control control in container.Controls)
{
if (controlTypes.Contains(control.GetType()))
{
control.Visible = false;
}
if (control.Controls.Count > 0)
{
MakeControlsInvisible(control, controlTypes);
}
}
}
然后在所需的任何容器上使用它:
MakeControlsInvisible(this, typeof(Label), typeof(TextBox)); // Will make all labels and textboxes inside the entire form invisible.
MakeControlsInvisible(groupBox1, typeof(Label), typeof(TextBox));// Will make all labels and textboxes inside groupBox1 invisible.