如何在C#中查看groupbox内的所有项目

时间:2018-09-24 11:51:12

标签: c#

我有一个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;

此代码有效,并且似乎可以使用“组框”面板,但是标签和文本框的代码不起作用。

2 个答案:

答案 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.