Le problème est que FindControl() ne traverse pas certains enfants de contrôle tels qu'un contrôle basé sur un modèle. Si le contrôle que vous recherchez subsiste dans un modèle, il ne sera pas trouvé.
Nous avons donc ajouté les méthodes d'extension suivantes pour faire face à cela. Si vous n'utilisez pas la version 3.5 ou si vous voulez éviter les méthodes d'extension, vous pouvez en faire une bibliothèque à usage général.
Vous pouvez maintenant obtenir le contrôle que vous êtes après par le codage:
var button = Page.GetControl("MyButton") as Button;
Les méthodes d'extension font le travail récursif pour vous. J'espère que cela t'aides!
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, cela devrait être p l'art du cadre! – Marcel