在TabControl中查找控件

时间:2009-10-29 02:12:49

标签: c# .net

所有

我试图在TabControl中按名称查找控件。但是,我当前的方法不会下降到控件的子级。什么是最好的方法

Control control = m_TabControlBasicItems.Controls[controlName];

控制总是为空,因为它是下面的两个(或三个)级别。 TabPage,GroupBox,有时候是RadioButtons

的Panel

谢谢!

6 个答案:

答案 0 :(得分:3)

.NET没有公开搜索嵌套控件的方法。你必须自己实现递归搜索。

以下是一个例子:

public class MyUtility
    {
        public static Control FindControl(string id, ControlCollection col)
        {
            foreach (Control c in col)
            {
                Control child = FindControlRecursive(c, id);
                if (child != null)
                    return child;
            }
            return null;
        }

        private static Control FindControlRecursive(Control root, string id)
        {
            if (root.ID != null && root.ID == id)
                return root;

            foreach (Control c in root.Controls)
            {
                Control rc = FindControlRecursive(c, id);
                if (rc != null)
                    return rc;
            }
            return null;
        }
    }

答案 1 :(得分:3)

您需要通过所有控件进行递归才能找到合适的控件。

Here是一个很好的例子。你应该能够复制和粘贴并用无模式调用它。

粘贴代码段 以防链接终止

/// <summary>
/// Finds a Control recursively. Note finds the first match and exists
/// </summary>
/// <param name="container">The container to search for the control passed. Remember
/// all controls (Panel, GroupBox, Form, etc are all containsers for controls
/// </param>
/// <param name="name">Name of the control to look for</param>
public Control FindControlRecursive(Control container, string name)
{
    if (container == name) return container;

    foreach (Control ctrl in container.Controls)
    {
        Control foundCtrl = FindControlRecursive(ctrl, name);

        if (foundCtrl != null) return foundCtrl;
    }

    return null;
}

答案 2 :(得分:2)

尝试循环选项卡面板中的所有容器:

foreach(var c in tab_panel.Controls)
{
   if(c is your control)
     return c;

   if(c is a container)
     loop through all controls in c;//recursion
}

答案 3 :(得分:1)

试试这个:

Control FindControl(Control root, string controlName)
{
    foreach (Control c in root.Controls)
    {
        if (c.Controls.Count > 0)
            return FindControl(c);
        else if (c.Name == controlName)
            return c;            
    }
    return null;
}

答案 4 :(得分:0)

mmm,您是否考虑过接口而不是名称?将控件的类型更改为从当前控件类型派生的类,并实现标识所需控件的接口。然后,您可以递归循环选项卡的子控件,以查找实现该接口的控件。通过这种方式,您可以在不破坏代码的情况下更改控件的名称,并进行编译时检查(名称中没有拼写错误)。

答案 5 :(得分:-1)

请参阅MSDN ...

System.Web.UI.Control.FindControl(string id);

通过控件ID递归搜索控件的子控件。

非常适合我。