C#
Привет,
Я разрабатывал c# веб-приложения в течение нескольких лет и существует одна проблема, я продолжаю приезжать upagainst, который я не могу найти логический способ решить.
Я имею контроль, к которому я хочу получить доступ в коде позади, это управление глубоко в разметке; проложенный под землей в ContentPlaceHolders, UpdatePanels, Панелях, GridViews, EmptyDataTemplates, TableCells (или безотносительно структурируют Вас, нравится.. точка - это, имеет больше родителей, чем farthers для справедливости).
Как я могу использовать FindControl("")
получить доступ к этому управлению, не делая этого:
Page.Form.Controls[1].Controls[1].Controls[4].Controls[1].Controls[13].Controls[1].Controls[0].Controls[0].Controls[4].FindControl("");
Напишите вспомогательный метод под названием 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;
}
Использовать рекурсивный 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;
}