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

C# Discussion :

Génération dynamique onglet et listbox [Débutant]


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut Génération dynamique onglet et listbox
    Bonjour à tous,

    Je rencontre un petit problème avec une génération dynamique d'onglets et un listbox contenu dans chaque onglet.

    La génération d'onglet fonctionne, l'ajout de la listbox fonctionne ... mais je n'arrive pas a avoir un contenu différent dans chaque listbox. Lorsque je test, j'obtiens des datarows avec un nombre de ligne différent, mais a la fin de l'exécution, tous les listbox de chaque onglets contiennent uniquement le contenu du dernier datarow. C'est comme si je n'avais qu'un seul listbox.

    Comme tout est dynamique, je n'ai aucune déclaration dans le XAML.

    - Dossier est un object qui contient un datatable dtfilelist
    - Dossier contient une liste sdos la liste des onglets a créer

    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
    29
    30
                DataTable dt1 = new DataTable();
                ListBox lb = new ListBox();
     
                string select = "";
                foreach (string newtab in dossier.sdos)
                {
                    select = "tab = '" + newtab+"'";
                    dt1.Clear();
     
                    DataRow[] result = dossier.dtfilelist.Select(select);
                    if (result.Length > 0)
                    {
                        dt1 = result.CopyToDataTable();
                        listBox1.ItemsSource = dt1.DefaultView;
                    }
                    lb.ItemsSource = dt1.DefaultView;
                    lb.Name = "list" + newtab;
     
                    TabItem tab = new TabItem();
                    tab.Header = newtab.ToString();
                    tab.Name = newtab.ToString();
                    var item = new TabItem
                    {
                        Header = newtab.ToString(),
                        Name = newtab.ToString(),
                        Content = lb
                    };
                    tabControl1.Items.Add(item);
     
                }
    Merci pour votre aide.

  2. #2
    Membre actif
    Homme Profil pro
    Developpeur
    Inscrit en
    Février 2013
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Février 2013
    Messages : 180
    Points : 271
    Points
    271
    Par défaut
    tu as juste une petit problème, lorsque tu instancie tes listbox ou devrait dire t'as listbox dans ton cas
    Fait attention a quel objet tu modifie, dans tas boucle tu modifie le contenue de tas listbox mais celle ci n'appartient pas a ton control tab
    donc ça a pour effet que tu as N tab et 1 listbox, même si tu vois des listbox dans chaque tab, en réalité tu n'en as qu'un seul en mémoire.

    pour pallier a ton souci, change l'endroit ou tu instancie ton nouveau listbox (celui ci doit ce trouver dans la boucle qui parcours tes tableaux)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut
    Bonjour ranzoken,

    Merci, cela a partiellement solutionner le problème. Comme tu me l'as parfaitement expliquer j'ai intégrer dans la boucle la création du listbox.

    J'ai maintenant avec mon jeu d'essai 3 onglets, le 1er est vide et c'est normal, le 2eme est vide et c'est pas normal, le 3eme contient bien les bonnes données correspondant à l'onglet.

    Quand je débug, sur le 2eme listbox du 2eme onglet, j'ai sur lb un item.count = 64 , mais lors de l'affichage il est vide.

    Merci pour votre aide.

    Modification du code de la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                ListBox lb = new ListBox();
     
                string select = "";
                foreach (string newtab in dossier.sdos)
                {
                    lb = new ListBox();
                    select = "tab = '" + newtab+"'";

  4. #4
    Membre actif
    Homme Profil pro
    Developpeur
    Inscrit en
    Février 2013
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Février 2013
    Messages : 180
    Points : 271
    Points
    271
    Par défaut
    Ton problème viens du faite que tu n'as pas assez posé t'es idées, Fait attention à quel objet tu modifie.
    si tu connais l'UML, un diagramme d'activité devrait t'aider à résoudre ton problème par toi même.

    Sinon prend une feuille de papier et un crayon et écrit ce que tu doit faire,
    1 - je crée ma liste de tableau
    2 - je parcours ma liste de tableau (boucle foreach sur mon objet tab)
    3 - si c'est le premier onglet je passe je fait rien
    4 - si ce n'est pas le premier onglet je crée un nouveau control listbox
    5 - je vais cherche mes donnée
    6 - je lie mes donnée avec mon listbox
    7 - fin de ma boucle je remonte en haut

    en écrivant ce que tu veux faire, ça te permettra de voir rapidement ce qui peux mal ce passé et ou tu risque d'avoir des difficultés.
    Après si tu veux un code tout fait, et fonctionnel, écrit ce que tu veux faire en expliquant bien tout, et quelqu'un pourra le faire, mais pour moi tu as juste besoin de posé tes idée et la solution apparaitra d'elle même.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut
    Merci,

    Ce que tu propose, c'est un changement de logique pour la création :
    1. Recup de la liste des onglets a créer
    2. Parcours la liste des onglets a créer (foreach sur la liste des onglets a créer)
    3. Création du listbox
    4. Filtre les données a afficher dans le listbox
    5. Chargement des données dans le liste box (si plus 0 ligne)
    6. Création de l'onglet (nom+ entete + listbox)
    7. Ajout de l'onglet au tabcontrol1
    8. Fin de boucle onglet suivant a créer


    Je vais essayer avec ta méthode ... et je vais chercher comment parcourir les onglets d'un tabcontrol et ajouter un controle a un onglet existant (vive Google Search)

    Je reviens si cela ne marche pas

    Merci pour ton aide

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut
    Bonsoir,

    Par rapport à la logique fourni, voici mon code

    • Le premier onglet est vide (pas de listbox présente)
    • Le deuxieme onglet a une listbox sans aucune valeur (dt1.rows.count=64)
    • Le troisième onglet à une listbox avec 31 valeurs (dt1.rows.count=31)




    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
    29
    30
    31
    32
                ListBox lb = null;
                Grid grid = null;
                string select = "";
                foreach (string newtab in dossier.sdos) // Création de la liste de tabitem
                {
     
                    var item = new TabItem
                    {
                        Header = newtab.ToString(),
                        Name = newtab.ToString(),
                        //Content = grid
                    };
                    tabControl1.Items.Add(item);
                }
     
                foreach (TabItem  titem in tabControl1.Items) // Parcours de la liste des onglets
                {
                    select = "tab = '" + titem.Header.ToString()+"'";
                    DataRow[] result = dossier.dtfilelist.Select(select); // Recherche valeur pour listbox
                    if (result.Length > 0)
                    {
                        dt1.Clear();
                        lb = new ListBox();
                        lb.Name = "list" + titem.Header.ToString();
                        dt1 = result.CopyToDataTable();
                        lb.ItemsSource = dt1.DefaultView;
                        lb.DisplayMemberPath = "filename";
                        grid = new Grid();
                        grid.Children.Add(lb);
                        titem.Content = grid;
                    }
                }
    Merci de votre aide, car je ne comprends pas pourquoi !!

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut
    Encore un test

    J'ai fait un test pour arrêter le code dans la boucle après le deuxième onglet. Donc il n'a pas créer le 3eme listbox.

    Et surprise, cette fois ci l'onglet N°2 est rempli avec les 64 lignes. Onglet 3 existe, mais est vide .. normal

    Comme j'ai rien de coder dans le WPF, cela doit venir d'une erreur d'objet dans le code.

    J'ai donc changer la place du dt.clear(), et je l'ai placé à la fin. Et résultat, tous les onglets sont vides.

    Donc en fait ma manipulation fait un binding depuis la source datatable dt1. Donc a chaque fois que je vide dt1 pour mettre les nouvelles valeurs, il perd le lien (c'est peu être pas tout à fait les bons termes techniques)

    J'ai donc 3 solutions :
    • Ajouter un boucle sur le dt1 et faire un lb.items.add(valeur)
    • Soit rendre unique le dt de chaque listbox
    • Créer un tableau des valeurs array[]

    Quel est a votre avis la meilleure solutions ?

    Merci de votre aide

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut
    Bonsoir a tous,

    J'ai résolu mon problème avec un array de datatable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                        dt1[i] = result.CopyToDataTable();
                        lb.ItemsSource = dt1[i].DefaultView;
    Cela fonctionne, mais je suis limiter sur le nombre d'onglet.

    Merci à tous, et particulièrement à ranzoken

    Si vous avez une meilleure solution, je laisse la discussion ouverte pour demain

  9. #9
    Membre actif
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Septembre 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 176
    Points : 297
    Points
    297
    Par défaut
    Bonjour,

    Pourquoi te limiter ?

    Les tableaux s'est passé de mode, utilise plutôt une List<DataTable> si ne veux pas être embêté ou un Dictionary<int, DataTable> si tu veux en plus conserver un identifiant de ta DataTable.

    Bonne continuation.
    L’aléatoire n’existe pas en informatique, c’est juste un moyen de dire que l’on a pas encore compris.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut
    Bonjour,

    Merci Kyroom, je vais regarder le developpement 'moderne' avec les list<> au lieu des tableaux.

    Grand merci pour cette nouvelle méthode pour moi

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

Discussions similaires

  1. VB - Génération dynamique de controles dans un forme
    Par jeanangel dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 19/12/2005, 21h09
  2. [C#] Déplacer dynamiquement un controle ListBox
    Par ptchek dans le forum Windows Forms
    Réponses: 4
    Dernier message: 09/11/2005, 12h01
  3. [DOM] Génération dynamique fichier xml
    Par Fabouney dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 03/10/2005, 09h45
  4. [SQL*Plus] génération dynamique du fichier de spool
    Par lalystar dans le forum Oracle
    Réponses: 3
    Dernier message: 06/12/2004, 10h44
  5. Réponses: 7
    Dernier message: 22/10/2004, 16h18

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