none
creation dynamique de controle RRS feed

  • Question

  • Bonjour,

    je voudrai creer des controle dynamiquement sur la page a partir de donnée externe du style des commentaire d'utilisateur.

    j'ai esayer ce code, mais il ne fonctionne pas :

    foreach (Metier.Commentaire com in ancienCommentaire)
                {
                    panelListeDesAnciensCommentaires.Controls.Add(new Metier.AncienCommentaire(com.id_Commentaire, com.Note.Value, com.User.Nom.ToString(), com.DateDuCommentaire.Value.ToShortDateString(), com.Commentaire1.ToString()));
                }

    la classe "AncienCommentaire" est heritée de la classe Panel :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace _5Stars.Metier
    {
        public class AncienCommentaire : Panel
        {
            int idCommentaire, note;
            Button boutonModifierCommentaire;
            Label labelCommentaireAAfficher, labelPseudo, labelDate;
            Table tableDOrganisation;
            Image[] listeDesEtoiles;
    
    
            public AncienCommentaire()
            {
                idCommentaire = 0;
                note = 1;
                boutonModifierCommentaire = new Button();
                labelCommentaireAAfficher = new Label();
                labelPseudo = new Label();
                labelDate = new Label();
                listeDesEtoiles = new Image[5];
    
                
    
                tableDOrganisation = new Table();
    
    
                mettreEnFormeLEnteteDuCommentaire();
    
    
                mettreEnFormeUnCommentaire();
                
            }
    
            public AncienCommentaire(int idCommentaire, int note, string pseudo, string date, string commentaire)
            {
                idCommentaire = 0;
                note = 1;
                boutonModifierCommentaire = new Button();
                labelCommentaireAAfficher = new Label();
                labelPseudo = new Label();
                labelDate = new Label();
                listeDesEtoiles = new Image[5];
    
    
                LabeldCommentaireAAfficher.Text = commentaire;
                LabelPseudo.Text = pseudo;
                labelDate.Text = date;
    
    
                tableDOrganisation = new Table();
    
    
                mettreEnFormeLEnteteDuCommentaire();
    
    
                mettreEnFormeUnCommentaire();
            }
    
            public Button BoutonModifierCommentaire
            {
                get { return boutonModifierCommentaire; }
                set { boutonModifierCommentaire = value; }
            }
    
            public Label LabeldCommentaireAAfficher
            {
                get { return labelCommentaireAAfficher; }
                set { labelCommentaireAAfficher=value; }
            }
    
            public Label LabelPseudo
            {
                get { return labelPseudo; }
                set { labelPseudo = value; }
            }
    
            public Label LabelDate
            {
                get { return labelDate; }
                set { labelDate = value; }
            }
    
            public Image[] Etoiles
            {
                get { return listeDesEtoiles; }
                set { listeDesEtoiles = value; }
            }
    
            public int IdCommentaire
            {
                get { return idCommentaire; }
                set { idCommentaire = value; }
            }
    
            public int Note
            {
                get { return note; }
                set { note = value; }
            }
    
    
    
            private void mettreEnFormeUnCommentaire()
            {
                TableRow rowCommentaire = new TableRow();
                TableCell cellCommentaire = new TableCell();
                
                cellCommentaire.Controls.Add(labelCommentaireAAfficher);
                cellCommentaire.ColumnSpan = 3;
                cellCommentaire.HorizontalAlign = HorizontalAlign.Left;
                rowCommentaire.Cells.Add(cellCommentaire);
    
                tableDOrganisation.Rows.Add(rowCommentaire);
            }
    
            private void mettreEnFormeLEnteteDuCommentaire()
            {
                TableRow rowEntete = new TableRow();
                TableCell[] cellEntete = new TableCell[4];
    
                cellEntete[0] = new TableCell();
                cellEntete[0].Controls.Add(labelPseudo);
                cellEntete[0].HorizontalAlign = HorizontalAlign.Left;
    
                for (int i = 1; i <= 5; i++)
                {
                    listeDesEtoiles[i-1] = new Image();
                    if (i <= note)
                    {
                        listeDesEtoiles[i-1].ImageUrl = HttpContext.Current.Server.MapPath("~\\Styles\\Images\\Icones\\etoileActiver.png");
                    }
                    else
                    {
                        listeDesEtoiles[i-1].ImageUrl = HttpContext.Current.Server.MapPath("~\\Styles\\Images\\Icones\\etoileDesactiver.png");
                    }
                }
    
                cellEntete[1] = new TableCell();
                cellEntete[1].Controls.Add(listeDesEtoiles[0]);
                cellEntete[1].Controls.Add(listeDesEtoiles[1]);
                cellEntete[1].Controls.Add(listeDesEtoiles[2]);
                cellEntete[1].Controls.Add(listeDesEtoiles[3]);
                cellEntete[1].Controls.Add(listeDesEtoiles[4]);
                cellEntete[1].HorizontalAlign = HorizontalAlign.Left;
    
                cellEntete[2] = new TableCell();
                cellEntete[2].Controls.Add(labelDate);
                cellEntete[2].HorizontalAlign = HorizontalAlign.Right;
    
                boutonModifierCommentaire.Text = "modifier";
                cellEntete[3] = new TableCell();
                cellEntete[3].Controls.Add(boutonModifierCommentaire);
                cellEntete[3].HorizontalAlign = HorizontalAlign.Center;
    
                rowEntete.Cells.AddRange(cellEntete);
    
                tableDOrganisation.Rows.Add(rowEntete);
            }
        }
    }

    est ce que quelqu'un a une idée du problème??

    merci d'avance :)

    mercredi 30 octobre 2013 15:15

Réponses

  • Bonjour,

    Vous devez créer vos contrôles dans la méthode CreateChildControls() et non dans le constructeur. De plus vous n'avez pas ajouté votre "tableDOrganisation" en tant qu'enfant de votre contrôle AncienCommentaire :

    protected override void CreateChildControls()
    {
        // Création de vos contrôles ici
        // Et ne pas oublier d'ajouter "tableDOrganisation" comme enfant :
        this.Controls.Add(this.tableDOrganisation);
    }

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    • Marqué comme réponse Aurel Bera jeudi 31 octobre 2013 14:14
    mercredi 30 octobre 2013 21:40
    Modérateur
  • Oui : rajoutez simplement runat=server puis nommez le tag.

    Suivant le tag, ce sera alors un HtmlImage, HtmlButton, etc. (cf le namespace System.Web.HtmlControls). Exemple :

    <a Href=http://www.c2i.fr runat="server" id="myanchor"/>

    Dans le code, myanchor sera un HtmlAnchor

    Remarque général : la création dynamique de contrôle est une mauvaise idée.

    Préférez un contrôle avec plusieurs états qui suivant l'état affiche telle ou telle partie ou alors des contrôles type grid, listview & co.


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    • Marqué comme réponse ahmedmahdi jeudi 31 octobre 2013 15:55
    jeudi 31 octobre 2013 08:49
  • Avez-vous  Include System.Web ou Using System.Web (selon le langage utilisé)?
    Si vous n'êtes pas dans une page .aspx.cs ou .vb ce n'est pas inclus.
    En plus Server.MapPath vous retourne le chemin local donc une image avec

    URL = "c:\monrepertoire\ma_image.jpg" c'est incorrecte dans le contexte Web.

    Utilisez simplement la chemin relatif sans Server.MapPath d'une maniere "../rep_images/ma_image.jpg".

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    • Marqué comme réponse ahmedmahdi jeudi 31 octobre 2013 15:56
    jeudi 31 octobre 2013 13:24
  • merci,

    c'est ce que je voulais.

    je viens de remarquer autre chose, les images existant sur la liste des étoiles "listeDesEtoiles" ne s'affiche pas.

    je n'arrive pas a utiliser "Server.MapPath" au lieu "HttpContext.Current.Server.MapPath" directement puisque c'est une classe a part.

    est ce que il y a une autre solution??

    • Marqué comme réponse ahmedmahdi jeudi 31 octobre 2013 15:55
    jeudi 31 octobre 2013 09:57

Toutes les réponses

  • Bonjour,

    Vous devez créer vos contrôles dans la méthode CreateChildControls() et non dans le constructeur. De plus vous n'avez pas ajouté votre "tableDOrganisation" en tant qu'enfant de votre contrôle AncienCommentaire :

    protected override void CreateChildControls()
    {
        // Création de vos contrôles ici
        // Et ne pas oublier d'ajouter "tableDOrganisation" comme enfant :
        this.Controls.Add(this.tableDOrganisation);
    }

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    • Marqué comme réponse Aurel Bera jeudi 31 octobre 2013 14:14
    mercredi 30 octobre 2013 21:40
    Modérateur
  • merci pour ta réponse je vais essayer et je te ferai  un retour dès que possible

    merci :)

    jeudi 31 octobre 2013 06:47
  • merci ça marche très bien.

    juste une autre question

    est ce que le code C# peut interragir avec les balises HTML(pas asp)??

    si oui, comment on pourrait interragir avec ces balises (je n'ai pas réussi à les manipiuler)??

    jeudi 31 octobre 2013 06:57
  • Bonjour

    L'interaction c'est limitée. Vous pouvez ajouter HTML avec Response.Write ou avec un contrôle de type Literal.
    Pour des autres choses vous devez utiliser JavaScript.
    Mais si vous nous expliquez qu’est que vous voulez faire, peut-être on aura la solution pour vous.

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    jeudi 31 octobre 2013 08:25
  • Oui : rajoutez simplement runat=server puis nommez le tag.

    Suivant le tag, ce sera alors un HtmlImage, HtmlButton, etc. (cf le namespace System.Web.HtmlControls). Exemple :

    <a Href=http://www.c2i.fr runat="server" id="myanchor"/>

    Dans le code, myanchor sera un HtmlAnchor

    Remarque général : la création dynamique de contrôle est une mauvaise idée.

    Préférez un contrôle avec plusieurs états qui suivant l'état affiche telle ou telle partie ou alors des contrôles type grid, listview & co.


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    • Marqué comme réponse ahmedmahdi jeudi 31 octobre 2013 15:55
    jeudi 31 octobre 2013 08:49
  • en fait c simple je voulais juste modifier la taille d'un tableau écrit en HTML
    jeudi 31 octobre 2013 09:53
  • merci,

    c'est ce que je voulais.

    je viens de remarquer autre chose, les images existant sur la liste des étoiles "listeDesEtoiles" ne s'affiche pas.

    je n'arrive pas a utiliser "Server.MapPath" au lieu "HttpContext.Current.Server.MapPath" directement puisque c'est une classe a part.

    est ce que il y a une autre solution??

    • Marqué comme réponse ahmedmahdi jeudi 31 octobre 2013 15:55
    jeudi 31 octobre 2013 09:57
  • Vous devez transformer le Table dans un <asp:Table runat= server et modifies avec code C# les propriétés  classe ou style.

    Ou mettez le table dans un DIV avec runat= server. Vous forcez la table d’utiliser tout l’espace du votre div, et modifiez avec code-behind les  propriétés  classe ou style du votre DIV.

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    jeudi 31 octobre 2013 10:31
  • merci c'est réglé, par contre les images que j'essaye d'afficher ne s'affiche pas.

    est ce que vous savez pourquoi??

    je suppose que la commande "HttpContext.Current.Server.MapPath" n'est pas adéquate, mais je ne sais pas par quoi la remplacer puisque "Server.MapPath" ne fonctionne pas.


    jeudi 31 octobre 2013 10:42
  • Avez-vous  Include System.Web ou Using System.Web (selon le langage utilisé)?
    Si vous n'êtes pas dans une page .aspx.cs ou .vb ce n'est pas inclus.
    En plus Server.MapPath vous retourne le chemin local donc une image avec

    URL = "c:\monrepertoire\ma_image.jpg" c'est incorrecte dans le contexte Web.

    Utilisez simplement la chemin relatif sans Server.MapPath d'une maniere "../rep_images/ma_image.jpg".

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    • Marqué comme réponse ahmedmahdi jeudi 31 octobre 2013 15:56
    jeudi 31 octobre 2013 13:24
  • merci beaucoup,

    ça marche nickel :)

    jeudi 31 octobre 2013 14:10
  • On a marqué la première réponse utile. 
    Veuillez marquer vous-même les autres réponses utiles.
    Merci !
    Cordialement,

    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    jeudi 31 octobre 2013 14:20