IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

créer dynamiquement un usercontrol


Sujet :

ASP.NET

  1. #1
    Membre régulier
    Inscrit en
    Mars 2003
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 8
    Par défaut créer dynamiquement un usercontrol
    Bonjour,

    Contexte: Je voudrais faire un template dans lequel je voudrais charger plusieurs contrôles de manière automatique. Pour cela j'utilise deux fichiers :

    - test.aspx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <%@ Page Language="C#" Debug="true" %>
    <%@ Import Namespace="System.Web.UI" %>
    <script language="C#" runat="server">
    UserControl C = null;
    protected void Page_Load(object sender, EventArgs e)
    {
           C = (UserControl)LoadControl("CtrlTest.ascx");
    	//((COpes)C).test = "mon test est OK";
    	CtrlC.Controls.Add(C);
    </script>
    <div id="CtrlC" runat="server"></div>
    - CtrlTest.ascx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <%@ Control ClassName="COpes" %>
    <script language="C#" runat="server">
    public string test = "AFFICHE SANS PARAM";
    </script>
    <H1><%=test%></H1>
    Requis:
    Créer des contrôles à la volée sans passer par une directive.

    Fonctionnel:
    Le contrôle s'affiche quand je ne remplis pas les propriétés.

    Erreur:
    Lorsque j'essaie de mettre à jour la propriété de mon contrôle cela ne fonctionne plus. J'obtiens ce message d'erreur :
    CS0246: The type or namespace name 'COpes' could not be found (are you missing a using directive or an assembly reference?)
    Cela marche uniquement si on ajoute cette instruction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <%@ Reference Control="CtrlTest.ascx" %>
    Je ne sais pas comment faire le cast pour qu'il reconnaisse mon contrôle et me permette d'accéder aux propriétés du contrôle.

    Merci,
    Choupi.

  2. #2
    Membre Expert Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    Par défaut
    Personnellemenent pour creer des controles à la volée je suis obligé de declarer une reference comme ceci dans ma page aspx (ascx ici):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <%@ Register src="MessageBox/SMS.ascx" tagname="SMS" tagprefix="MBox6" %>
    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="MessageList.ascx.cs" Inherits="MessageList" %>
    afin de pouvoir les charger à la volée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     uc = (WebMessage)LoadControl("MessageBox/SMS.ascx");
    en esperant que cela aura pu t'aider,

  3. #3
    Membre régulier
    Inscrit en
    Mars 2003
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 8
    Par défaut
    Bonjour Arthis,

    En fait, si je rajoute la directive "Reference" cela fonctionne très bien. Cependant j'aimerais ajouter des contrôles sans modifier la page *.aspx.

    Ta solution et la directive "Reference" m'oblige à lister au préalable les chemins de mes contrôles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <%@ Reference Control="CtrlTest.ascx" %>
     
    OU
     
    <%@ Register src="MessageBox/SMS.ascx" tagname="SMS" tagprefix="MBox6" %>
    Objectif : templatiser une page avec plusieurs blocs.
    Mon template possède plusieurs blocs.
    Un bloc correspond à un controle.
    Toutes les informations lié au contrôle sont saisies dans XML.

    Exemple:
    Donc si j'ai 3 bloc, je veux pouvoir afficher n'importe quel contrôle sans avoir de directive dans mon code. Si j'ajoute un 4e bloc dans mon XML, mon template devra afficher automatiquement le 4e bloc.

    Merci quand même pour ta réponse
    Choupi.

  4. #4
    Membre Expert Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    Par défaut
    pour faire ce que tu veux tu peux opérer cde cette facon, pas forcement la plus propre, mais cela peut amener un début de solution peut être :

    tu defini une classe de base dont heritera ton user control ou tu va definir tes proprietes ( dans mon exemple rapide , j ai utilisé un web site avec la classe dans appcode , à toi de changer cela..):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class BaseUserControl : System.Web.UI.UserControl
    {
        public string text = "toto";
     
    	public BaseUserControl()
    	{
    		//
    		// TODO: Add constructor logic here
    		//
    	}
    }
    ton control ascx se presentera alors de cette maniere :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <%@ Control Language="C#" AutoEventWireup="true"  Inherits="BaseUserControl" %>
    <h1><%= text %></h1>
    et la page qui appelera ton controle dynamiquement pourrait ressembler a ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <body>
        <form id="form1" runat="server">
        <div>
        <asp:PlaceHolder runat=server ID=C_PH_Conteneur>
        </asp:PlaceHolder>
        </div>
        </form>
    </body>
    cs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    protected void Page_Load(object sender, EventArgs e)
        {
            BaseUserControl uc = (BaseUserControl)LoadControl("UC.ascx");
            C_PH_Conteneur.Controls.Add(uc);
        }
    Dis moi ce que tu en penses, je connais pas tous les prérequis pour faire fonctionner ton systeme...

  5. #5
    Membre régulier
    Inscrit en
    Mars 2003
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 8
    Par défaut
    Bonjour Arthis,

    Avec beaucoup de retard, je donne des nouvelles pour ce sujet.

    Avec un membre de mon équipe nous avons réussi à faire ce que nous voulions avec de la réflection.

    Nous ne sommes pas très avance, mais des que j'ai du temps, je mettrais la solution utilisée.

    Merci,
    Choupi

Discussions similaires

  1. Créer dynamiquement un fichier XML
    Par sigap dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 26/07/2005, 12h53
  2. est il possible de créer dynamiquement une class ???
    Par SpaceFrog dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 12/07/2005, 16h22
  3. [C#] Inserer dynamiquement un userControl
    Par topolino dans le forum ASP.NET
    Réponses: 9
    Dernier message: 23/02/2005, 13h51
  4. [MFC] Créer dynamiquement une classe
    Par vanitom dans le forum MFC
    Réponses: 9
    Dernier message: 11/12/2004, 13h23
  5. Réponses: 4
    Dernier message: 13/05/2004, 13h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo