Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Le blog technique de Loïc Bar

Nouvelles technologies Web

Award

  • mvp

J'y serai...

Mes livres

Un contrôle utilisateur dans un autre

Il peut arriver qu'on veuille utiliser un User Control dans un autre User Control. On obtient alors ce genre d'erreur :

erreurUC

/!\ L'erreur n'apparait que lorsque vous déclarez vos User Controls dans le web.config.

On ne peut pas inclure l'un dans l'autre deux User Controls qui se trouve dans le même dossier. La solution est donc toute simple, il suffit de créer deux dossiers différents pour les deux User Controls.

  • MonDossier1
    • MonUC1.ascx
  • MonDossier2
    • MonUC2.ascx

Si on veut éviter les deux dossiers, on peut ajouter dans l'User Control un tag Register :

<%@ Register TagPrefix="uc2" Src="~/UserControls/Recommend.ascx" TagName="UCRecommend" %>

Le problème devient plus complexe quand nous devons inséré un User Control dans lui-même. Qu'est-ce que cela veut dire? Prenons un exemple : Nous avons un User Control de menu. On voudrait gérer des menus à plusieurs niveaux, nous allons donc faire appel à l'User Control lui-même pour afficher le menu représentant le sous menu.

Dans ce cas là, il n'est pas question d'avoir le même User Control dans plusieurs dossiers. On peut alors utiliser la technique du code behind. Le principe est de placer un panel et de charger notre User Control au Page_Load du panel.

protected void pn1_Load(object sender, EventArgs e)
    {
        Panel pn1 = (Panel)sender;

        UserControl uc = new UserControl();
        UserControls_VideoInfo uc1 = (UserControls_VideoInfo)uc;
        uc1 = (UserControls_VideoInfo)uc.LoadControl("~/UserControls/VideoInfo.ascx");
        pn1.Controls.Add(uc1);
    }

Ou encore (si on revient dans notre premier cas et qu'on ne veut pas plusieurs dossiers) :

protected void pn1_Load(object sender, EventArgs e)
    {
        Panel pn1 = (Panel)sender;
        UserControl uc = new UserControl();
        pn1.Controls.Add(uc.LoadControl("~/UserControls/Recommend.ascx"));
    }

Voilà, en espérant que ça aidera d'autres :-).

PS : Merci à Gaëlle et à Kim pour leur aide.

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: jeudi 5 juin 2008 10:37 par loicbar
Classé sous : , ,

Commentaires

cyril a dit :

Euh, j'ai pas compris là.

Tu as un dossier incs dans ce dossier tu as 2 UserControls ?

/default.aspx

/incs/

  UC1.ascx

  UC2.ascx

default contient UC1 qui contient UC2 ?

Je viens de vérifier et cela ne cause pas d'erreur ! Quel type de projet web utilises tu ? J'ai du mal à voir en quoi ce genre de choses peut poser un problème.

Sinon pour ta solution, tu vas avoir un problème avec les viewstate / postback ... en effet rajouter un contrôle dynamiquement dans le page_load n'est pas une bonne chose et ne permet pas de récuperer à chaque fois le contenu d'une textbox (le loadpostdata est effectué avant le page_load)

# juin 5, 2008 11:25

warning a dit :

De même, je n'ai jamais rencontré non plus ce genre de problème, pourtant j'utilise régulièrement des contrôles dans les autres qui sont du même dossier.

# juin 5, 2008 11:35

loicbar a dit :

@cyril : tu le mettrai dans quel événement?

# juin 5, 2008 12:00

loicbar a dit :

J'ai mis à jour l'article en prenant en compte vos commentaire et ceux de Tonio :D.

Chacun sa méthode on dirait :p

# juin 5, 2008 12:14

cyril a dit :

Je l'aurais plutot mis dans le CreateChildControls.

Mais avec ASP.net 2.0 le ProcessPostData est effectué une 2éme fois après le load, pour justement éviter ce genre de problème ...

Si tu charges dynamiquement un UserControl dans le page_load, je ne pense pas que tu ai accès au contenu des postdata dans le load de l'UC.

Lorsque tu charges un UserControl contenant un button, textbox + label, si tu clicks sur le button tu auras accès au contenu du textbox dans le btn_click (car le processPostData est refait après le load et le btn_click est fait juste après (dans le RaiseChangeEvents/RaisePostBackEvent)) par contre dans le load de l'UC tu ne devrais pas avoir accès au contenu de la textbox (car y'a pas encore eu de ProcessPostData)

Bref, ASP.net 2.0 permet de "corriger" pas mal de "problème" qui sont principalement du à une meconnaissance du "Page Life Cycle" (normal vu la complexité du schmilblik). Je préfére largement rajouter mes contrôles dynamique dans le CreateChildControl car c'est ainsi que ASP.net a été prévu (dixit Reflector :p).

Mais c'est très rare que je dois faire du dynamique, dans la majorité des cas, l'utilisation de repeater et/ou multiview permette de s'en passer, sinon je créer un vrai WebControl.

Pour en savoir plus sur les contrôles dynamique : http://blogs.codes-sources.com/cyril/archive/2007/09/18/ajout-de-controle-dynamique-dans-une-page-asp-net.aspx

Sur le "page life cycle" : http://blogs.developpeur.org/photos/cyril/images/23825/original.aspx

Par contre je ne comprend pas pourquoi ASP.net refuse de mettre 2 UC du meme path lorsqu'ils sont enregistré dans le web.config ... je regarderais quand j'aurais le temps, ca peut être interessant :)

# juin 5, 2008 13:15

ROMELARD Fabrice a dit :

Je suis comme Cyril, bien que développant de moins en moins, les Users Controls appelant d'autres UC, j'en ai fait pas mal en ASP.NET et cela ne m'a jamais posé particulièrement problème.

Le tout se faisant souvent en dynamique dans mon code behind.

Je n'était peut être pas dans le même cas, mais tous les UC étaient toujours dans le même sous répertoire.

Fabrice

# juin 5, 2008 15:45
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Microsoft annonce le nom commercial de Windows 7 par Code is poetry le il y a 4 heures et 15 minutes

- [Silverlight] Téléchargez la version finale (et les outils associés) dès maintenant ! par Thomas Lebrun le il y a 5 heures et 44 minutes

- Vilain bug avec IQueryable et la syntaxe yield : System.BadImageFormatException "An attempt was made to load a program with an incorrect format. (Exce... par Matthieu MEZIL le il y a 8 heures et 34 minutes

- SQL Server 2008 : Un livre en cours de préparation ! par SQL Server vu par Christian Robert le il y a 17 heures et 26 minutes

- IIS7 : à quel pool d'application correspond le processus w3wp.exe par Atteint de JavaScriptite Aiguë [Cyril Durand] le il y a 18 heures et 23 minutes

- PDC 2008 - J-14 ! par Nix's Blog le il y a 20 heures et 8 minutes

- [Silverlight] La version finale de Silverlight 2 sera disponible en téléchargement demain ! par Thomas Lebrun le il y a 22 heures et 1 minutes

- SharePoint 2007 : Professional Developers Conference 2008 par Philippe Sentenac [MVP SharePoint] le 10-13-2008, 12:28

- [Silverlight] En attendant Silverlight 2 RTW par Blog Technique d'Audrey PETIT le 10-11-2008, 21:55

- Le nouveau Gojira, c’est pour lundi… par CoqBlog le 10-11-2008, 01:18