Ответ 1
Проблема заключается в том, что 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();
}