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

- [SharePoint] Les sessions TechDays 2012… par Le blog de Patrick [MVP SharePoint] le il y a 4 heures et 24 minutes

- TechDays Paris 2012 : Session pleinière jour 3 par Blog Technique de Romelard Fabrice le 02-09-2012, 11:01

- Mishra Reader : un lecteur RSS très Zune Style en Open Source ! par Cyril Sansus le 02-09-2012, 08:28

- [framework 4] Les Tasks et le Thread UI par Fathi Bellahcene le 02-09-2012, 00:33

- Workflow Foundation 3 a un pied dans la tombe par Blog de Jérémy Jeanson le 02-08-2012, 22:15

- TechDays Paris 2012 : Nouvelles tendances du poste de travail - Bring Your own PC par Blog Technique de Romelard Fabrice le 02-08-2012, 19:42

- TechDays Paris 2012 : System Center Service Manager 2012 Vue d’ensemble par Blog Technique de Romelard Fabrice le 02-08-2012, 17:32

- TechDays Paris 2012 : Pleinière second jour par Blog Technique de Romelard Fabrice le 02-08-2012, 16:23

- TechDays Paris 2012 : Retour d'expérience sur la mise en place d'un Cloud Privé par Blog Technique de Romelard Fabrice le 02-08-2012, 16:04

- TechDays Paris 2012 : Comment SharePoint a sauvé mes TechDays par Blog Technique de Romelard Fabrice le 02-07-2012, 23:59