Accès à un userControl depuis Repeater

Résolu
YannVB Messages postés 5 Date d'inscription vendredi 8 septembre 2006 Statut Membre Dernière intervention 18 janvier 2008 - 31 oct. 2007 à 10:22
YannVB Messages postés 5 Date d'inscription vendredi 8 septembre 2006 Statut Membre Dernière intervention 18 janvier 2008 - 18 janv. 2008 à 10:07
Bonjour,

je souhaite accéder à un UserControl contenu dans l'itemTemplate d'un Repeater de ma webform, de manière à alimenter dynamiquement les propriétées du userControl qui sera répété, sans avoir recours à du code <%# DataBinder.eval() %> dans la page ASPX.

J'ai parcouru pas mal de forums et ai donc décidé d'utiliser les évènements ItemDataBound ou ItemCreated de manière à récupérer le control présent dans le repeater mais sans succès, ma référence est toujours Null suite à mon FindControl("") !

Je ne peux donc pas accéder au UserControl qui sera répété via le userControl !

Je cherche depuis plusieurs jours, c'est donc en dernier espoir que je poste ici en espérant que vous pourrez éclairer ma lanterne sur le pourquoi !
La solution posté ici (reproduite dans mon code, voir ci dessous) ne fonctionne pas : http://www.aspfr.com/infomsg_COMMENT-ACCEDER-USERCONTROL-PARTIR-REPEATER_993739.aspx

La page ASPX :

(...)

<%@ Register Src="~/ControlesUtilisateursPortail/UCNews.ascx" TagName="UCNews" TagPrefix="uc1" %>
  

              
                    <HeaderTemplate>
                    </HeaderTemplate>
                   
                       
                   
                    <FooterTemplate>
                    </FooterTemplate>
               
           
       

   

Code Behind :

       protected void rptInformations_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
           UCNews ucNews = e.Item.FindControl("ucInformation") as UCNews;
             // vaut Null !
        }

        protected void rptInformations_ItemCreated(object sender, RepeaterItemEventArgs e)
        {
            UCNews news =  e.Item.FindControl("ucInformation") as UCNews;
             //vaut null
        }

7 réponses

YannVB Messages postés 5 Date d'inscription vendredi 8 septembre 2006 Statut Membre Dernière intervention 18 janvier 2008
31 oct. 2007 à 12:16
Trouvé! (après trois jours de recherche...)

Dans le ItemDataBound, il faut faire attention au type de l'item considéré.

Il y a 1 Header, 1 Footer, et N Items (voir alternateItem ou Normal Item selon qu'on est configuré plusieurs styles)...

Or dans le header je n'ai pas mon contrôle ucInformation puisqu'il est dans les headers !

donc le findControl (le premier était dans un item de type Header) me renvoyait forcemment Null...

A la fois si simple et si logique, qu'autant perturbant quand comme moi on débute !
3
cs_obel Messages postés 34 Date d'inscription lundi 4 août 2003 Statut Membre Dernière intervention 17 juin 2008
18 janv. 2008 à 09:32
Bonjour,

j'ai un souci avec un uc dans un repeater qui resemble un petit peu a ton problème,

quand je mets un <HeaderTemplate> dans mon repeater j'ai un message d'erreur magnifique :

WebUserControl WebUserC = Arg.Item.FindControl("WebUserControl1") as WebUserControl;           

WebUserC.SetData((DataRowView)Arg.Item.DataItem);

System.NullReferenceException: La référence d'objet n'est pas définie à une instance d'un objet.

Alors est ce que j'ai la bonne methode pour tranférer les données a mon uc  ??!!??

comment fait tu pour faire ton transfert des données entre ton repeater et ton uc ?? ou vois tu mon erreur ??

Merci d'avance
Olivier
0
YannVB Messages postés 5 Date d'inscription vendredi 8 septembre 2006 Statut Membre Dernière intervention 18 janvier 2008
18 janv. 2008 à 09:47
As tu vérifié que ton FindControl ne renvoyait pas Null (met un espion en Debug ou vérifie que WebUserC != null)

A mon avis tu rencontres le même problème que moi, la méthode ItemDataBound est appellée plusieurs fois, donc tu n'as pas forcement en premier la partie qui contiendra ton controle WebUserControl1

Au début tu auras le header, puis les footer éventuels, puis les items, et ton webusercontrol sera QUE dans les items. Donc il faut vérifier le type d'argument lié à la méthode renvoyé ItemDataBound avant tout !

Pour moi, le plus simple (et ce que je fais) c'est vérifier que la référence à mon controle est bien différente de Null)
0
cs_obel Messages postés 34 Date d'inscription lundi 4 août 2003 Statut Membre Dernière intervention 17 juin 2008
18 janv. 2008 à 09:52
Merci pour ta rapidité de reponse !!!!

mais comment verifier le type ????
j'ai mis mon code en détails  ici http://www.aspfr.com/infomsg_WEBUSERCONTROL-DANS-REPEATER_1062553.aspx
merci d'avance !!

Olivier
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
YannVB Messages postés 5 Date d'inscription vendredi 8 septembre 2006 Statut Membre Dernière intervention 18 janvier 2008
18 janv. 2008 à 09:56
Tu vérifies e.Item.ItemType

Mais je te conseil plutot après ta première ligne de code

WebUserControl WebUserC = Arg.Item.FindControl("WebUserControl1") as WebUserControl;

de faire un tout simple test que la référence est différente de null !

if (WebUserC != null)
{
}
0
cs_obel Messages postés 34 Date d'inscription lundi 4 août 2003 Statut Membre Dernière intervention 17 juin 2008
18 janv. 2008 à 10:00
Heu !!!!
Je crois que j'ai besoin d'un Café !!!

Un double même !!

Merci beaucoup je suis ravi de voir qu'il y a des mecs sur ce site qui donne des réponse claire rapide et efficace !!!!
0
YannVB Messages postés 5 Date d'inscription vendredi 8 septembre 2006 Statut Membre Dernière intervention 18 janvier 2008
18 janv. 2008 à 10:07
je t'en prie, on a tous besoin d'un double café le vendredi matin
0
Rejoignez-nous