2008-09-23 5 views
4

J'ai une part WebPart Sharepoint qui charge un contrôle utilisateur personnalisé. Le contrôle utilisateur contient un répéteur qui à son tour contient plusieurs LinkButtons.ASP.NET - Ajout d'un gestionnaire d'événements à LinkButton dans Repeater dans un appel RenderContent

Dans l'appel RenderContent dans le Webpart j'ai un code pour ajouter des gestionnaires d'événements:

 ArrayList nextPages = new ArrayList(); 
     //populate nextPages .... 
     AfterPageRepeater.DataSource = nextPages; 
     AfterPageRepeater.DataBind(); 

     foreach (Control oRepeaterControl in AfterPageRepeater.Controls) 
     { 
      if (oRepeaterControl is RepeaterItem) 
      { 
       if (oRepeaterControl.HasControls()) 
       { 
        foreach (Control oControl in oRepeaterControl.Controls) 
        { 
         if (oControl is LinkButton) 
         { 
          ((LinkButton)oControl).Click += new EventHandler(PageNavigateButton_Click); 
         } 
        } 
       } 
      } 
     } 

La PageNavigateButton_Click fonction est jamais appelée cependant. Je peux le voir être ajouté en tant que gestionnaire d'événement dans le débogueur cependant.

Des idées? Je suis perplexe comment faire cela.

+0

J'ai un peu dérangé le code après avoir lu les suggestions des gens. J'essaie d'ajouter les gestionnaires d'événements maintenant dans la fonction CreateChildControls() mais ils ne sont toujours pas déclenchés. Merci pour toute l'aide jusqu'à présent, il est apprécié –

+1

Pour ceux qui voient cela en retard dans le jeu. N'utilisez pas CreateChildControls ... C'est encore trop tard dans le cycle. Au lieu de cela, remplacez le gestionnaire OnInit pour créer tous vos contrôles dynamiques. – NotMe

Répondre

6

Au moment de l'appel de RenderContent(), tous les gestionnaires d'événements enregistrés ont été appelés par l'infrastructure. Vous devez ajouter les gestionnaires d'événements dans une ancienne méthode, comme OnLoad():

protected override void OnLoad(EventArge e) 
{ base.OnLoad(e); 
    EnsureChildControls(); 

    var linkButtons = from c in AfterPageRepeater.Controls 
               .OfType<RepeaterItem>() 
        where c.HasControls() 
        select c into ris 
         from lb in ris.OfType<LinkButton>() 
         select lb; 

    foreach(var linkButton in linkButtons) 
    { linkButton.Click += PageNavigateButton_Click 
    }       
} 
+0

J'ai essayé mettre le code qui ajoute les gestionnaires d'événements dans la méthode CreateChildControls() à présent. Merci –

1

Vous devez vous assurer que le bouton de liaison est à nouveau ajouté à l'arborescence de contrôle et/ou que l'événement est recâblé jusqu'au contrôle avant le déclenchement de l'événement.

Article @ 4guysfromrolla

1

Je ne l'ai jamais fait un SharePoint webpart, donc je ne sais pas si cela va appliquer. Mais si c'était une page apsx simple, je dirais qu'au moment où il est rendu, il est trop tard. Essayez d'ajouter les gestionnaires d'événements dans les événements Init ou PreInit du contrôle.


Edit: Attendez, je pense que Dilli-O peut-être raison. Voir le Ajout de contrôles de bouton à une section Répéteur à la fin de http://www.ondotnet.com/pub/a/dotnet/2003/03/03/repeater.html. C'est dans VB.NET, mais vous pouvez facilement faire la même chose en C#.

2

Avez-vous essayé d'assigner les propriétés CommandName et CommandArgument à chaque bouton pendant que vous parcourez? Le contrôle Repeater prend en charge l'événement ItemCommand, qui est un événement qui sera déclenché lorsqu'un contrôle avec la propriété CommandName est frappé. À partir de là, il est assez facile à traiter car les valeurs CommandName et CommandArgument sont transmises à l'événement et sont facilement accessibles.

+0

Gordon, consultez: http://www.ondotnet.com/pub/a/dotnet/2003/03/03/repeater.html –

+0

J'ai essayé, mais les événements ne sont toujours pas virés –

1

Comme d'autres l'ont souligné, vous ajoutez le gestionnaire d'événements trop tard dans le cycle de vie de la page. Pour SharePoint WebParts, vous souhaiterez généralement remplacer les méthodes OnInit/CreateChildControls de la classe pour gérer l'activité.

1

vous avez besoin de votre webpart pour implémenter l'interface marqueur INamingContainer, il est utilisé par le cadre pour permettre postbacks de revenir au contrôle correct ... également les commandes de votre webpart tous besoin d'avoir une carte d'identité.

Questions connexes