如何在表单中找到Panel对象?

时间:2012-12-04 20:50:30

标签: c# .net

我有一个生成布局的XML文件的任务,但是我似乎在识别窗体上的Panel控件时遇到了问题。要识别对象,我使用这样的东西:

foreach (Control c in this.Controls) {
    if (c is Button) {
        //generate XML...
    } else if (c is Panel) {
        //generate XML...
    }
}

它找到所有控件都很好,但不是Panel对象。 谁能告诉我这里我做错了什么?面板不是控件吗?

4 个答案:

答案 0 :(得分:1)

您可以使用此递归功能。

var panels = FindControls<Panel>(aForm).ToList();

IEnumerable<T> FindControls<T>(Control ctrl) where T: Control
{
    foreach (Control c in ctrl.Controls)
    {
        if (c.GetType() == typeof(T)) yield return (T)c;
        foreach (var subC in FindControls<T>(c))
            yield return subC;
     }
}

答案 1 :(得分:1)

面板一个控件,但您只能获得直接位于表单中的控件,而不是其他控件中的控件。

那么这样的事情怎么样:

void DoRecursive(Control ctrl)
{
    foreach (Control subCtrl in ctrl.Controls) DoRecursive(subCtrl);

    if (ctrl is Button) etc.
}

或者您的//generate XML...作为按钮退出foreach。也许它有一个break

答案 2 :(得分:0)

我尝试使用一个简单的表单,在表单上有一个按钮和一个面板,面板内有一个按钮。它找到了第一个按钮和面板。 也许问题是你想访问其父级是面板的控件吗?

答案 3 :(得分:-1)

您的代码应该有效。尝试修改代码以不执行else if并查看是否可以找到Panel:

foreach (Control c in this.Controls) {
    if (c is Panel) {
        MessageBox.Show("Hey, I found the " + c.Name + " panel!");
    }
}

我们也可以尝试按名称查找它,看看它是什么类型的控件:

foreach (Control c in this.Controls) {
    // Looks for a control called 'panel1' - put in your panel's name
    if (c.Name == "panel1") {
        MessageBox.Show("Hey, I found a " + c.GetType().ToString());
    }
}