C#
您好,
我已经开发了几年的c#web应用程序,并且有一个问题我不断发现我无法找到合理的解决方法。
我有一个控件我希望在后面的代码中访问,这个控件在标记的深处;在ContentPlaceHolders,UpdatePanels,Panels,GridViews,EmptyDataTemplates,TableCells(或者你喜欢的任何结构)中埋葬......重点是它拥有更多的父母而不是更多的父母。
如何在不执行此操作的情况下使用FindControl("")
来访问此控件:
Page.Form.Controls[1].Controls[1].Controls[4].Controls[1].Controls[13].Controls[1].Controls[0].Controls[0].Controls[4].FindControl("");
答案 0 :(得分:12)
编写一个名为FindControlRecursive的辅助方法,由Jeff Atwood自己提供。
private Control FindControlRecursive(Control root, string id)
{
if (root.ID == id)
{
return root;
}
foreach (Control c in root.Controls)
{
Control t = FindControlRecursive(c, id);
if (t != null)
{
return t;
}
}
return null;
}
答案 1 :(得分:3)
使用Recursive FindControl:
public T FindControl<T>(string id) where T : Control
{
return FindControl<T>(Page, id);
}
public static T FindControl<T>(Control startingControl, string id) where T : Control
{
// this is null by default
T found = default(T);
int controlCount = startingControl.Controls.Count;
if (controlCount > 0)
{
for (int i = 0; i < controlCount; i++)
{
Control activeControl = startingControl.Controls[i];
if (activeControl is T)
{
found = startingControl.Controls[i] as T;
if (string.Compare(id, found.ID, true) == 0) break;
else found = null;
}
else
{
found = FindControl<T>(activeControl, id);
if (found != null) break;
}
}
}
return found;
}
答案 2 :(得分:0)
或者在LINQ中:
private Control FindControlRecursive(Control root, string id)
{
return root.ID == id
? root
: (root.Controls.Cast<Control>()
.Select(c => FindControlRecursive(c, id)))
.FirstOrDefault(t => t != null);
}