1

我的任务是生成布局的 XML 文件,但我似乎在识别表单上的面板控件时遇到了问题。为了识别物体,我使用了这样的东西:

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

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

4

4 回答 4

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;
     }
}
于 2012-12-04T21:19:08.453 回答
1

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

那么这样的事情怎么样:

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

    if (ctrl is Button) etc.
}

或者,也许您//generate XML...作为 Button 退出了foreach. 也许它有一个break.

于 2012-12-04T21:46:02.233 回答
0

我用一个简单的表单尝试了你的代码,表单上有一个按钮和一个面板,面板内有一个按钮。它对我来说找到了第一个按钮和面板。也许问题是您想访问其父级为面板的控件?

于 2012-12-04T21:02:06.577 回答
-1

您的代码应该可以工作。尝试将代码修改为不执行else if并查看是否可以找到面板:

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());
    }
}
于 2012-12-04T20:57:14.693 回答