Проблема заключается в том, что FindControl() не пересекает определенные дочерние элементы управления, такие как шаблонный элемент управления. Если элемент управления, который вы используете после жизни в шаблоне, он не будет найден.
Итак, мы применили следующие методы расширения, чтобы справиться с этим. Если вы не используете 3.5 или хотите избежать методов расширения, вы можете сделать из них общую библиотеку общего назначения.
Теперь вы можете получить контроль вы после кодирования:
var button = Page.GetControl("MyButton") as Button;
методы удлиняющей сделать рекурсивную работу для вас. Надеюсь это поможет!
public static IEnumerable<Control> Flatten(this ControlCollection controls)
{
List<Control> list = new List<Control>();
controls.Traverse(c => list.Add(c));
return list;
}
public static IEnumerable<Control> Flatten(this ControlCollection controls,
Func<Control, bool> predicate)
{
List<Control> list = new List<Control>();
controls.Traverse(c => { if (predicate(c)) list.Add(c); });
return list;
}
public static void Traverse(this ControlCollection controls, Action<Control> action)
{
foreach (Control control in controls)
{
action(control);
if (control.HasControls())
{
control.Controls.Traverse(action);
}
}
}
public static Control GetControl(this Control control, string id)
{
return control.Controls.Flatten(c => c.ID == id).SingleOrDefault();
}
public static IEnumerable<Control> GetControls(this Control control)
{
return control.Controls.Flatten();
}
Вау, это должно быть p искусство Рамки! – Marcel