protected void viewHoursButton_OnClick(object sender, EventArgs e)
{
var viewHoursPopup = parentGridView.FindControl("viewHoursPopup")
as WebControl;
var viewHoursGridView = parentGridView.FindControl("viewHoursGridView");
if (viewHoursPopup != null && viewHoursGriView != null)
{
viewHoursPopup.Show();
viewHoursGridView.DataBind();
}
}
...ou...
protected void viewHoursButton_OnClick(object sender, EventArgs e)
{
var viewHoursButton = (Button)sender;
var viewHoursPopup = viewHoursButton.Parent.FindControl("viewHoursPopup")
as WebControl;
var viewHoursGridView = viewHoursButton.Parent.FindControl("viewHoursGridView");
if (viewHoursPopup != null && viewHoursGriView != null)
{
viewHoursPopup.Show();
viewHoursGridView.DataBind();
}
}
Pourquoi?
ItemTemplates, RowTemplates, EditTemplates, etc., sont tous imbriqués dans ce que les formulaires appellent les NamingContainers. Vous ne pouvez pas accéder à ces contrôles car ils sont injectés dynamiquement au moment de l'exécution, leurs identifiants de contrôle ne sont pas automatiquement mappés par la classe partielle génétique de CodeBehind.
Il y a 2 solutions:
Enveloppez le contenu de votre modèle dans une chaîne de fonte. Que CodeBehind de UserControl aura un accès à la compilation à tous les contrôles qui ne sont pas encore imbriqués dans d'autres modèles. Pour permettre l'interaction entre UserControl et le modèle parent qui le contient, exposez des événements et des propriétés publiques sur UserControl
Utilisez .FindControl (String ControlId) pour "rechercher" les modèles actuels du contrôle contenant le contrôle que vous recherchez. Assurez-vous simplement de les vérifier contre NULL avant d'essayer d'invoquer quoi que ce soit sur eux, et qu'ils sont jetés au type approprié en fonction des méthodes que vous avez l'intention de leur invoquer.