El problema es que FindControl() no atraviesa ciertos controles secundarios como un control de plantilla. Si el control que está después vive en una plantilla, no se encontrará.
Por lo tanto, hemos agregado los siguientes métodos de extensión para solucionar esto. Si no está utilizando 3.5 o quiere evitar los métodos de extensión, podría crear una biblioteca de propósito general a partir de estos.
Ahora usted puede conseguir el control que está después de la codificación:
var button = Page.GetControl("MyButton") as Button;
métodos de la extensión hacen el trabajo recursivo para usted. ¡Espero que esto ayude!
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();
}
Wow, esto debería ser p ¡arte del Marco! – Marcel