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 :

Afficher un WebUserControl dans un DataGrid


Sujet :

ASP.NET

  1. #1
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut Afficher un WebUserControl dans un DataGrid
    Bonjour,
    si quelqu'un peut me sauver la vie ça serait pas mal.
    Mon problème est dans l'intitulé, je ne sais pas afficher un WebUserControl dans un DataGrid.
    Je met quand même un bout de code (qui ne marche pas) pour donner une idée de ce que je cherche à faire (c'est dans Page_Load; j'ai simplifié à l'extrème pour pouvoir mettre toutes les étapes donc ça peut paraître un peu bizarre, mais en gros ça marche avec des strings, par contre sur la partie UserControl, j'ai l'impression de nager complétement)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    // On initialise la table
            DataTable dc = new DataTable("ma_table");
     
            // On met en place les colonnes
            for (int i = 0; i < 10; i++)
                dc.Columns.Add(new DataColumn("colonne" + i.ToString(), typeof(MonWebUserControl))); // avec string
     
            // On Remplit les lignes
            for (int it = 0; it < 8; it++)
            {
                DataRow dr = dc.NewRow();
                for (byte cont = 0; cont < dc.Columns.Count; cont++)
                {
                    Control ctrlcellule = LoadControl("~/MonWebUserControl.ascx");
                    MonWebUserControl controlcellule = new MonWebUserControl();
                    controlcellule = (MonWebUserControl)ctrlcellule;
                    controlcellule.Visible = true;
                    dr[cont] = controlcellule;
                }
                dc.Rows.Add(dr);
            }
     
            // On initialise le datagrid et on le lie
            DataGrid dgdc = new DataGrid();
            dgdc.DataSource = dc;
            dgdc.DataBind();
            // On l'affiche
            form1.Controls.Add(dgdc);

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2007
    Messages : 58
    Par défaut
    Salut pythéas,

    Je ne comprends pas très bien ce que tu veux faire. Ranger 10 usercontrols dans un datatable , un par colonne , et 10 fois le même. Le datagrid doit appeller ToString() des objet liés pour les afficher, je ne sais pas si ton user control override ToString() donc déjà je pense que la ça risque de coincer.. et ensuite je pense plutot que ce que tu devrais(/voudrais?) faire c'est poser ton user control dans l'itemtemplate d'un repeater et le controler via ses propriétés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <%@ Register TagName="client" TagPrefix="uc" Src="monusercontrool.ascx" %>
    ...
    <asp:Repeater runat=server DataSourceId="GetClients">
    <itemtemplate>
    <uc:client idclient='<%# Eval("idClient")%>' nomClient='<%# Eval("nomClient)"%>' />
    </itemtemplate>
    </asp:Repeater>
    ...par exemple.

    Enfin si je suis à côté de la plaque dis le moi, à cette heure je commence à faiblir...

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Déjà, merci de ta réponse.
    Dans mon programme le nombre de colonnes est normalement variable (en fait j'ai souvent la même valeur mais j'aurais aimé conserver cette possibilité) mais comme j'ai des boucles un peu tordues j'ai épuré mon code pour mettre en lumière mon problème; par contre chaque cellule devrait contenir le même usercontrol (avec quelque modifs comme le texte d'un label par exemple mais ça reste le même type)

    Effectivement, mon user control n'override pas ToString() mais je ne sais pas faire ça de manière à ce que sa conserve l'allure de mon user control justement.

    Sinon je voudrais éviter d'utiliser un Repeater (j'ai eu des instructions contraires, ça me parait moins dynamique et je suis mauvais en "langage à balise") mais en désespoir de cause je finirai peut être par essayer..

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2007
    Messages : 58
    Par défaut
    Les userscontrols dans ton code sont de même type mais à chaque fois tu crées une nouvelle instance. Le repeater fait de même, le nombre d'instance qu'il y a de lignes retournées par ton datasource.
    Tu pourrais changer le label par une propriété public de ton control.

    Pou ce qui est de ton problème avec le "language balise",
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Repeater rep = new Repeater(); rep.DataSource=MaSource;
    fonctionne aussi bien que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataGrid dgdc = new DataGrid();dgdc.DataSource = dc;
    Le repeater fonctionne avec des templates ce qui te permet de customizer complètement ton affichage alors que la table d'un datagrid est moins souple.

    Mais la solution n'est peut-être pas la bonne si le nombre de control/ligne est aléatoire. Si tu pouvais détailler un peu plus ce que tu veux faire...

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    L'idée c'est de faire une sorte de calandrier (donc souvent 7 colonnes de "lundi" à "dimanche" (mais le jour initial peut changer et on devrait pouvoir ne pas afficher tous les jours -encore que ça c'est moins important-) et entre 4 et 6 lignes -nombre de semaines entamées dans le mois-), bon ça c'est pas trop difficile (avec des strings).
    Ensuite j'ai un controle pour chaque jour qui devrait afficher par exemple les réunions et avoir disons un bouton pour les modifier mais l'intérêt c'est justement de pouvoir changer le user control.
    Tout mon problème consiste à faire afficher ce user control dans mon datagrid

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2007
    Messages : 58
    Par défaut
    A mon avis pour continuer dans ton sens il te faudrait créer un datagrid personnel héritant de datagrid et changer la méthode d'affichage des données, lorsque le contenu d'une cellule est un control ne pas appeler tostring() mais plutôt Render() ou quelque chose dans le genre.
    Si j'étais toi je créerai plutot des templates avec un visible sur le controle et des propriétés pour l'affichage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <Columns>
            <asp:TemplateColumn>// * 7
            <ItemTemplate>
               <MonControlJour labelTxt="mon texte" visible='<%# MonInstructionDeTest %>' />
            </ItemTemplate>    
    ...
    </Columns>

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    En tout cas, knowl merci pour tes efforts

    Pour être franc je n'ai pas vraiment essayé la solution dans ton dernier post, en plus de ma phobie des balises j'ai cruellement manqué de temps (il fallait un résultat qui ressemble à quelque chose en très peu de temps)
    Je regarderai ça de plus près dès que j'aurais un peu de temps.

    Avant d'avoir une solution satisfaisante, deux mots sur le bricolage que j'ai utilisé (si jamais ça intéresse quelqu'un je peux toujours détaillé) :
    Je crée une table de cellules vides (dans ma boucle : dr[cont] = null;) ensuite je la lie à mon DataGrid et je met (à l'aide d'une boucle) directement mes controles dans celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dgdc.Items[i].Cells[j].Controls.Add(MonUserControl);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. MAJ afficher deux table dans un datagrid
    Par amelhajer dans le forum VB.NET
    Réponses: 1
    Dernier message: 09/04/2007, 07h36
  2. Réponses: 1
    Dernier message: 19/07/2006, 12h47
  3. Afficher des données dans un datagrid à partir d'une base de données MySQL
    Par General_Garrisson dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 13/07/2006, 15h14
  4. [C#] Comment afficher les données dans un DataGrid ?
    Par lepovre dans le forum ASP.NET
    Réponses: 7
    Dernier message: 05/07/2006, 17h52
  5. [C#] Afficher des images dans un datagrid
    Par mbibim63 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/05/2005, 12h22

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