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

Windows Forms Discussion :

Charger à un arbre à partir d'une Table et ordre alphabétique


Sujet :

Windows Forms

  1. #1
    Membre régulier Avatar de Chacha35
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 264
    Points : 114
    Points
    114
    Par défaut Charger à un arbre à partir d'une Table et ordre alphabétique
    Bonjour,

    J'ai un TreeView que je remplie avec une Table que j'ai elle même remplie avec une procédure stockée.

    J'ai réussi mais le problème c'est que mes noeuds ne sont pas rangés par ordre alphabétique.

    Je me suis donc dis que j'allais faire un ORDER BY dans ma procédure mais maintenant mon système de remplissage ne fonctionne plus.

    Voici ma table OBJET (qui correspond pour ceux qui me suivent à tous mes form et control):

    Objet_Id | Objet_Name | Objet_Type | Objet_Id_Père
    Voici comment je la remplie :

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
            private void parcourControl(Control c, int IdPere)
            {
     
                //AJOUT DANS LA BASE
                if (c.GetType().ToString() != "System.Windows.Forms.VScrollBar" && c.GetType().ToString() != "System.Windows.Forms.HScrollBar")
                {
                    string sql = "AjoutObjet '" + c.Name + "','" + c.GetType().ToString() + "','" + IdPere.ToString() + "' ";
                    SqlConnection ConsultConnection = new SqlConnection(oSurveillant.strConnexionSecurite);
                    SqlCommand Command = new SqlCommand(sql, ConsultConnection);
     
                    Command.Connection.Open();
                    int IdFils = (int)Command.ExecuteScalar();
                    Command.Connection.Close();
                    if (c.Controls.Count != 0)
                    {
                        foreach (Control c1 in c.Controls)
                        {
     
                            parcourControl(c1, IdFils);
                        }
                    }
                }
            }
     
            private void Bt_Upload_Click(object sender, EventArgs e)
            {
                string sql = "ViderObjets ";
                SqlConnection ConsultConnection = new SqlConnection(oSurveillant.strConnexionSecurite);
                SqlCommand Command = new SqlCommand(sql, ConsultConnection);
     
                Command.Connection.Open();
                Command.ExecuteNonQuery();
                Command.Connection.Close();
     
                string sql2 = "AjoutObjet 'Consultation' ,'Application','0' ";
                SqlConnection ConsultConnection2 = new SqlConnection(oSurveillant.strConnexionSecurite);
                SqlCommand Command2 = new SqlCommand(sql2, ConsultConnection2);
     
                Command2.Connection.Open();
                Id_Application = (int)Command2.ExecuteScalar();
                Command2.Connection.Close();
     
                Assembly asm = Assembly.GetExecutingAssembly();
                // Parcours de tous les types de l'assembly
                foreach (Type t in asm.GetTypes())
                {
                    // Il s'agit d'une form
                    if (t.BaseType == typeof(Form))
                    {
                        string sql3 = "AjoutObjet '" + t.Name.ToString() + "','" + t.BaseType.ToString() + "','" + Id_Application.ToString() + "'";
                        SqlConnection ConsultConnection3 = new SqlConnection(oSurveillant.strConnexionSecurite);
                        SqlCommand Command3 = new SqlCommand(sql3, ConsultConnection3);
     
                        Command3.Connection.Open();
                        IdFormEnCours = (int)Command3.ExecuteScalar();
                        Command3.Connection.Close();
     
                        if (t.Name.ToString() == "F_ConsultRef")
                        {
                            Form f = (Form)Activator.CreateInstance(t, oSurveillant, false);
                            foreach (Control c in f.Controls)
                            {
                                parcourControl(c, IdFormEnCours);
                            }
                        }
                        else
                        {
                            Form f = (Form)Activator.CreateInstance(t, oSurveillant);
                            foreach (Control c in f.Controls)
                            {
                                parcourControl(c, IdFormEnCours);
                            }
                        }
                    }
                }
            }
    Donc au début j'ajoute une ligne consultation application avec un père à 0.
    Je veux que cette ligne soit mon premier noeud.

    Et ensuite j'ajoute le premier form que je trouve et puis tous ses control, après je passe au form d'après et ses control, ainsi de suite.

    Voici comment je remplie mon arbre:

    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
            private void TreeView_Load()
            {
                TreeViewObjets.Nodes.Clear();
                ChargerObjet(); // Fonction qui remplie MaTableObjet avec ma procédure stockée
    
                TreeNode n = new TreeNode(MaTableObjet.Rows[0][1].ToString() + " - " + MaTableObjet.Rows[0][2].ToString());
                this.TreeViewObjets.Nodes.Add(n);
    
    
                TreeNode nn = new TreeNode(MaTableObjet.Rows[1][1].ToString() + " - " + MaTableObjet.Rows[1][2].ToString().Remove(0, 21));
                n.Nodes.Add(nn);
    
    
                string IdPere = MaTableObjet.Rows[1][0].ToString();
                string IdGrandPere = MaTableObjet.Rows[0][0].ToString();
    
                BoucleArbre(IdGrandPere, IdPere, n, nn, 2);
                BoucleProperty(); // Fonction qui ajoute les property qui sont ajoutées à la main
            }
    
            public void BoucleArbre(string IdGrandPere, string IdPere, TreeNode NGrandPere, TreeNode NPere, int a)
            {
                TreeNode n1 = null;
                int i = a;
                if (i < MaTableObjet.Rows.Count)
                {
                    n1 = new TreeNode(MaTableObjet.Rows[i][1].ToString() + " - " + MaTableObjet.Rows[i][2].ToString().Remove(0, 21));
    
    // ERREUR :L'index et le compte doivent faire référence à un emplacement situé dans la chaîne.
    //Nom du paramètre : count
    
                    string IdPereEnCours = MaTableObjet.Rows[i][3].ToString();
    
                    if (IdPereEnCours == IdGrandPere)
                    {
                        NGrandPere.Nodes.Add(n1);
                        NPere = n1;
                        a++;
                    }
                    else
                    {
                        NPere.Nodes.Add(n1);
                        a++;
                    }
                    BoucleArbre(IdGrandPere, IdPere, NGrandPere, NPere, a);
                }
            }

    Comme pour remplir mon arbre je m'appuyai sur le fait que dans MaTableObjet j'avais :

    Appli
    Form
    Control
    Control
    Form
    Control

    Maintenant pour mon petit raisonnement qui m'avait demandé un travail cérébral intance ne fonctionne plus.

    Peut_être y a t il un moyen de trier l'arbre après l'avoir remplie, ou de trier MaTableObjet quand je la remplie ou de trier la table dans la base en la remplissant?

    Merci d'avance, surtout si vous avez eu le courage de lire tout ce qui précède.

  2. #2
    Membre émérite
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Points : 2 265
    Points
    2 265
    Par défaut
    Vu que tu insère dans un ordre précis, à savoir application, premier contrôles, ses contrôles et ainsi de suite, cela devrait se retrouver en base avec les Objet_ID.

    Donc normalement, ils devraient être dans cet ordre lors de la récupération des données dans la base.

    Par contre, ce que j'aimerais savoir c'est comment as-tu reformulé ta requête pour que le remplissage ne marche plus ?
    Et qu'entends-tu par là, seulement que les données ne sont plus bien en ordre, que tu as un message d'erreur, que tout plante ?

    Personnellement, je pense que tu devrais pouvoir t'en sortir juste en modifiant la requête.
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  3. #3
    Membre régulier Avatar de Chacha35
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 264
    Points : 114
    Points
    114
    Par défaut
    Je remplie ma Table OBJET comme je l'ai expliqué, puis je remplie MaTableObjet (DataTable) et je me sert de cette table pour remplir mon arbre.

    Avant MaTAbleObjet était un simple SELECT * donc la copie de la Table OBJET.

    Mais je voudrai que mon arbre soit rangé par odre alphabétique c'est-à-dire :

    Appli
    ->A (form)
    -->A (control)
    -->B (control)
    -->C (control)
    ->B (form)
    -->A (control)

    ...

    Car ce n'est pas le cas, car il prend les form et les control comme ils viennent.

    Donc j'ai fais un ODER BY Objet_Name dans ma requete, mais du coup mais objets ne sont plus rangés comme avant dans MaTableObjet.

    Je pense que MaTableObjet est bien remplie, mais ma méthode de remplissage ne marche plus (explication de l'erreur dans le code).

    Donc, c'est pas vraiment une solution précise que je vous demande, mais plutôt une idée pour que mon arbre soit affiché par ordre alphabétique.

    Après je me lancerai comme je peux dans le code.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 337
    Points : 456
    Points
    456
    Par défaut
    Utilise peut être la méthode select du datatable pour trier sur ton champs Objet_Name.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach(DataRow myRow in  MaTableObjet.Select("","Objet_Name ASC"))
    {
        //TRAITEMENT
    }
    Bonne continuation.

  5. #5
    Membre émérite
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Points : 2 265
    Points
    2 265
    Par défaut
    Et un ORDER BY Objet_Id_Père, Objet_Id_Name ?
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  6. #6
    Membre régulier Avatar de Chacha35
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 264
    Points : 114
    Points
    114
    Par défaut
    Pour la méthode de hotsizzle, c'est comme je triai MaTableObjet avant de la parcourir donc il n'y a pas de différence avec le ORDER BY Objet_Name, enfin je pense. Mais j'ai comme même apris quelque chose.

    Et sinon pour la réponse de laedit, je ne savais même pas qu'on pouvais faire un "double order by".

    Après étude du double order by, : je sens que ça va le faire. Je tente.
    Merci à vous deux.

  7. #7
    Membre régulier Avatar de Chacha35
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 264
    Points : 114
    Points
    114
    Par défaut
    Alors petit soucis j'ai tous mes control sont dans le dernier form.

    Logique, car les form on tous le meme père : Consultation Application.

    Donc dans MaTableObjets:

    Consultation Application
    --->AForm
    --->BForm
    --->CForm
    --->DForm
    ----------->AControl
    ----------->BControl
    ----------->CControl

    C'est légèrement prise de tête!
    -------------------------------------------


    Il faut tout remanier, je pense.

    Je trie par ordre alphabétique simple.
    Puis je charche le premier form
    je chope son id
    puis je prend un par un les control qui ont comme pere cet id (ils sont dans l'ordre alphabétique (c'est long à écrire : ordre alphabétique))

    puis je passe o form d'après et je recommence...

    Vous en pensez quoi?
    Vous avez autre chose?

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 337
    Points : 456
    Points
    456
    Par défaut
    Je penses que tu devrais résonner autrement, essai de filtrer ton datatable (passe le filtre en paramètres de ta méthode BoucleArbre), Commence par le parcourir pour Id_PERE IS NULL , puis pour ID_PERE = ID_OBJET de la boucle d'avant, et cela trier sur le champ Objet_Name.

    Je n'es pas trop le temps sinon je t'aurais réécrit ta méthode BoucleArbre.
    J'en aurais peut être plus en fin de journée.

    Bonne continuation.

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 337
    Points : 456
    Points
    456
    Par défaut
    Je viens de poster exactement ce que tu as dit au dessus :p

  10. #10
    Membre émérite
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Points : 2 265
    Points
    2 265
    Par défaut
    C'est effectivement la solution la plus simple à mettre en oeuvre actuellement, je n'arrive pas à trouver un solution SQL satisfaisante.

    Par contre, un point à savoir : la méthode Select() de la DataTable est terriblement lente si la table possède beaucoup de données.

    Il faudra donc peut être la remplacer par une méthode que tu feras toi et qui sera constituée d'une boucle sur les lignes de la table et comprenant une condition pour récupérer une liste de lignes dont un des élément correspondra à ce que tu attends. (j'ai été clair là ? )
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  11. #11
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 337
    Points : 456
    Points
    456
    Par défaut
    Personnellement j'utilise .Select() sur une table qui comporte 10K de rows et ce n'est pas lent ....

  12. #12
    Membre émérite
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Points : 2 265
    Points
    2 265
    Par défaut
    Tu ne le vois pas forcément, mais ayant pu faire des comparaisons, majoritairement sur des gros volumes de données (plus de 10k rows), la méthode perso était plus rapide.

    Après, je ne dénigre pas la méthode, je ne fais que dire ce que j'ai pu constater quand j'ai eu besoin d'optimiser des applications d'accès aux données.
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  13. #13
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 337
    Points : 456
    Points
    456
    Par défaut
    oK :p

  14. #14
    Membre régulier Avatar de Chacha35
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 264
    Points : 114
    Points
    114
    Par défaut
    C'est bon!

    J'ai mis un ORDER BY Objet_Name dans ma procédure stockée.

    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
     
            private void TreeView_Load()
            {
                TreeViewObjets.Nodes.Clear();
                ChargerObjet();
     
                BoucleArbre(0);
                BoucleProperty();
            }
     
            public void BoucleArbre(int IdPere)
            {
                foreach (DataRow myRow in MaTableObjet.Select("'"+IdPere+"' = Objet_Id_Pere"))
                {
                    TreeNode n1 = new TreeNode(myRow[1].ToString() + " - " + myRow[2].ToString());
                    TreeViewObjets.Nodes.Add(n1);
                    BoucleArbre((int)myRow[0], n1);
                }
            }
     
            public void BoucleArbre(int IdPere, TreeNode NPere)
            {
                foreach (DataRow myRow in MaTableObjet.Select("'" + IdPere + "' = Objet_Id_Pere"))
                {
                    TreeNode n1 = new TreeNode(myRow[1].ToString() + " - " + myRow[2].ToString().Remove(0, 21));
                    NPere.Nodes.Add(n1);
                    BoucleArbre((int)myRow[0],n1);
                }
            }
    Merci beaucoup !

    Encore une victoire de canard !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/02/2014, 10h12
  2. Réponses: 6
    Dernier message: 06/03/2008, 10h46
  3. Réponses: 2
    Dernier message: 18/01/2008, 10h10
  4. Réponses: 4
    Dernier message: 02/05/2005, 20h25
  5. Réponses: 9
    Dernier message: 07/10/2004, 19h41

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