所有
我试图在TabControl中按名称查找控件。但是,我当前的方法不会下降到控件的子级。什么是最好的方法
Control control = m_TabControlBasicItems.Controls[controlName];
控制总是为空,因为它是下面的两个(或三个)级别。 TabPage,GroupBox,有时候是RadioButtons
的Panel谢谢!
答案 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递归搜索控件的子控件。
非常适合我。