Проблема в том, что 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();
}