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 :

Datatable vers TreeView [Débutant]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Datatable vers TreeView
    Bonjour à tous,

    Cela fait un petit moment que je me bats avec le peuplement d'un TreeView depuis une DataTable, j'espère que vous pourrez m'aider à avancer.

    Au Load de mon Form, j'effectue une requête sur une base de données SQL, dont je balance le résultat dans une DataTable, jusque là pas de souci. Le résultat de la requête est le suivant :



    Je dois ensuite afficher tout ça dans mon Form par l'intermédiaire d'un TreeView. Je souhaite obtenir ceci :



    Et tout ce que je parviens à obtenir, c'est au mieux cela :



    Le bout de code concerné que j'ai commencé à écrire est le suivant :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    private void Form1_Load(object sender, EventArgs e)
    {
    	// Connexion à la base de données
     
    	SqlConnection maConnexion = new SqlConnection("Data Source=(local);Initial Catalog=maBase;Integrated Security=True");
    	maConnexion.Open();
    	SqlDataAdapter monAdapter = new SqlDataAdapter();
    	monAdapter.SelectCommand = new SqlCommand("SELECT NOMPROJET, CONSTITUER.CYCLEVIE, NOMLOT, IDINTERV FROM PROJET JOIN CONSTITUER ON PROJET.CODEPROJET = CONSTITUER.CODEPROJET AND PROJET.CODEPROJET = 3 LEFT JOIN LOT ON PROJET.CODEPROJET = LOT.CODEPROJET AND LOT.CYCLEVIE = CONSTITUER.CYCLEVIE AND PROJET.CODEPROJET = 3 LEFT JOIN INTERVENTION ON INTERVENTION.CODEPROJET = PROJET.CODEPROJET AND LOT.IDLOT = INTERVENTION.IDLOT AND PROJET.CODEPROJET = 3", maConnexion);
     
    	// Importation du résultat de la requête dans la DataTable
     
    	DataTable maTable = new DataTable();
    	monAdapter.Fill(maTable);
    	maConnexion.Close();	
     
    	// Début du traitement du TreeView et création du noeud racine
     
    	treeView.BeginUpdate();
    	treeView.Nodes.Clear();
            DataRow maRow = maTable.Rows[0];
    	TreeNode nodeProjet = new TreeNode(maRow["PROJET"].ToString());
    	treeView.Nodes.Add(nodeProjet);
     
    	// Début des problèmes...
     
    	Int32 n = 0;
    	foreach (DataRow dr in maTable.Rows)
    	{
    		treeView.Nodes[0].Nodes.Add(dr[1].ToString());
    		if (dr[2].ToString() != "")
    		{
    			treeView.Nodes[0].Nodes[n].Nodes.Add(dr[2].ToString());
    		}
    		if (dr[3].ToString() != "")
    		{
    			treeView.Nodes[0].Nodes[n].Nodes[0].Nodes.Add(dr[3].ToString());
    		}
    		n++;
    	}
    	treeView.EndUpdate();
    	treeView.ExpandAll();
    }
    Y aurait-il donc une solution pour éviter dans mon TreeView la redondance des noeuds ?

    Merci par avance pour votre aide...

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    ne pas faire for each .Add mais vérifier avant s'il faut réellement faire un ajout (pas déjà présent)

    tu peux stocker les noeuds dans un dictionary<T> pour les retrouver plus rapidement
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Invité
    Invité(e)
    Par défaut
    Je te remercie pour ce premier élément de réponse.

    J'ai tourné autour de ton idée de stocker les noeuds dans une liste, malheureusement je patauge encore... Au mieux, je n'arrive à me débarrasser de la redondance des noeuds qu'au premier niveau, après je ne sais plus quoi faire :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    List<string> maListe = new List<string>();
    for (Int32 i = 0; i < maTable.Rows.Count; i++)
    {
    	DataRow dr = maTable.Rows[i];
    	if (!maListe.Contains(dr[1].ToString()))
    	{
    		maListe.Add(dr[1].ToString());
    	}
    }
    foreach (string s in maListe)
    {   
    	treeView.Nodes[0].Nodes.Add(s);            
    }
    Honnêtement, je ne serais pas contre un petit coup de main supplémentaire (désolé, je ne pratique le C# que depuis 2 mois à peine).

    Merci d'avance.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bon, j'ai trouvé !

    Je n'y suis pas pour grand-chose cela dit, j'ai juste bidouillé et adapté un code vu je ne sais plus où sur le Net, prévu au départ pour afficher une arborescence de fichiers dans un TreeView. Mais l'essentiel c'est que ça marche !

    Pour info :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    private void Form1_Load(object sender, EventArgs e)
            {
                SqlConnection maConnexion = new SqlConnection("Data Source=(local);Initial Catalog=BASE;Integrated Security=True");
                maConnexion.Open();
                SqlDataAdapter monAdapter = new SqlDataAdapter();
                monAdapter.SelectCommand = new SqlCommand("SELECT NOMPROJET AS PROJET, CONSTITUER.CYCLEVIE AS ETAPE, NOMLOT AS LOT, IDINTERV AS 'NUMERO INTERVENTION' FROM PROJET JOIN CONSTITUER ON PROJET.CODEPROJET = CONSTITUER.CODEPROJET AND PROJET.CODEPROJET = @codeprojet LEFT JOIN LOT ON PROJET.CODEPROJET = LOT.CODEPROJET AND LOT.CYCLEVIE = CONSTITUER.CYCLEVIE AND PROJET.CODEPROJET = @codeprojet LEFT JOIN INTERVENTION ON INTERVENTION.CODEPROJET = PROJET.CODEPROJET AND LOT.IDLOT = INTERVENTION.IDLOT AND PROJET.CODEPROJET = @codeprojet", maConnexion);
                monAdapter.SelectCommand.Parameters.Add("@codeprojet", SqlDbType.Int).Value = 3;            
                monAdapter.Fill(maTable);
                maConnexion.Close();    
     
                treeView.BeginUpdate();
                treeView.Nodes.Clear();    
     
                List<string> maListe = new List<string>();
                foreach (DataRow dr in maTable.Rows)
                {
                    maListe.Add(dr[0].ToString() + "*" + dr[1].ToString() + "*" + dr[2].ToString() + "*" + dr[3].ToString());            
                }
     
               // C'est ici que ça commence
     
               foreach (string monString in maListe)
                {
                    string[] monString2 = monString.Split('*');
     
                    TreeNodeCollection LesNodesDuTreeview = treeView.Nodes;
                    for (Int32 i = 0; i < monString2.Length; i++)
                    {
                        Boolean dejaAjoute = false;
                        foreach (TreeNode NodeCourant in LesNodesDuTreeview)
                        {
                            if (NodeCourant.Text.Equals(monString2[i]))
                            {
                                dejaAjoute = true;
                                LesNodesDuTreeview = NodeCourant.Nodes;
                                continue;
                            }
                        }
     
                        if (dejaAjoute == false & monString2[i].ToString() != "")
                        {
                            TreeNode monNode = new TreeNode(monString2[i]);
                            LesNodesDuTreeview.Add(monNode);
                            LesNodesDuTreeview = monNode.Nodes;
                        }
                    }                
                }
                treeView.EndUpdate();
                treeView.ExpandAll();
            }

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

Discussions similaires

  1. Exporter Datatable vers Excel
    Par Chris@Xerox dans le forum Windows Forms
    Réponses: 16
    Dernier message: 11/06/2019, 13h14
  2. C#: exportation d'un DataTable vers Excel
    Par Leelith dans le forum Windows Forms
    Réponses: 4
    Dernier message: 08/02/2010, 19h05
  3. Export de table/datatable vers csv, xls, etc.
    Par goulmak dans le forum GWT et Vaadin
    Réponses: 1
    Dernier message: 10/11/2009, 14h37
  4. datatable vers excel
    Par tortuegenie dans le forum ASP.NET
    Réponses: 3
    Dernier message: 13/08/2009, 16h41
  5. [SP-2007] WebPart avec DataTable vers vue XSLT
    Par nonoxp dans le forum SharePoint
    Réponses: 1
    Dernier message: 27/07/2009, 12h03

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