是否有更简单的方法从表单获取3深度面板控件,以便以编程方式添加新的控件?

时间:2012-09-30 02:42:26

标签: c# foreach controls

我有一个VB Windows程序由其他人创建,它被编程,以便任何人都可以通过使用类库添加到程序的功能,程序调用它们(即...类库,DLL文件)插件,我正在创建的插件是一个C#类库。即... .dll

这个特定的插件我正在以Label的形式添加一个简单的日期时钟功能,并将其插入到3 Deep的面板中。我已经测试的代码,它的工作原理。我的问题是:有更好的方法吗?例如,我使用Controls.Find 3次不同,每次我知道我正在寻找什么面板,并且只有一个面板添加到Control []数组。所以我再次对一个只有3个不同时间保存单个元素的数组做一个foreach。

就像我说的那样,代码可以正常工作并按照我的预期进行操作。它似乎过度减少,我想知道是否会出现性能问题。

这是代码:

    foreach (Control p0 in mDesigner.Controls)
        if (p0.Name == "Panel1")
        {
            Control panel1 = (Control)p0;
            Control[] controls = panel1.Controls.Find("Panel2", true);

            foreach (Control p1 in controls)
            if (p1.Name == "Panel2")
            {
                Control panel2 = (Control)p1;
                Control[] controls1 = panel2.Controls.Find("Panel3", true);
                foreach(Control p2 in controls1)
                    if (p2.Name == "Panel3")
                    {
                        Control panel3 = (Control)p2;
                        panel3.Controls.Add(clock);
                    }
             }
         }

2 个答案:

答案 0 :(得分:0)

使用以下功能

   public static Control FindControlRecursive(Control control, string id)
    {
        if (control == null) return null;
        Control ctrl = control.FindControl(id);
        if (ctrl == null)
        {
            foreach (Control child in control.Controls)
            {
                ctrl = FindControlRecursive(child, id);
                if (ctrl != null) break;
            }
        }
        return ctrl;
    }
}

然后

Control panel3 = FindControlRecursive(mDesigner.Controls, "Panel3");

答案 1 :(得分:0)

使用Andrei共享的概念我能够找到一个方法,它不仅适用于我想要添加到Panel的Label,而且还允许我从另一个简单修改大小的方法调用它另外两个控件的位置,使这个功能非常可重复使用。

private Control FindControlRecursive(Control ct, string id)
{
    Control[] c;
    Control ctr;

    if (ct == null)
        c = mDesigner.Controls.Find(id, true);
    else
        c = ct.Controls.Find(id, true);

    foreach (Control child in c)
    {
        if (child.Name == id)
        {
            ctr = child;
            return ctr;
        }
        else
        {
            ctr = FindControlRecursive(child, id);
            if (ctr != null)
                return ctr;
        }
    }
    return null;
}

电话代码如下:

Control ct = null;
Control panel3 = FindControlRecursive(ct, "Panel3");

// and Here is where I can Add controls or even change control properties.
if (panel3 != null)
    panel3.Controls.Add(clock);

感谢您的帮助...