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

VB.NET Discussion :

Remplissage Treeview via BDD SQL


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 161
    Points : 86
    Points
    86
    Par défaut Remplissage Treeview via BDD SQL
    Bonjour à tous,

    J'ai un soucis pour remplir un Treeview à partir d'une base SQL.

    Quand je mets mes données dans une structure, je récupère bien mes 27 lignes de ma base mais quand je construit mes treeview je ne récupère que 9 enregistrement, en fait je me fait ejecter lorsque j'arrive dans les enfants du 2e noeud.

    Voici mon code pour le load de la fenetre :
    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
     Private Sub uc_test_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Dim Articles(30) As s_article    'Permet de travailler sur un tableau de 100 adresses
            Dim I_Article As Int32 = 0
     
     
     
     
     
            ds = New DataSet
            Dim dt As DataTable = DevFactDS.REFERENTIEL
     
            REFERENTIELTableAdapter.Fill(Me.DevFactDS.REFERENTIEL)
     
            Dim Root_Level As TreeNode = Nothing
            Dim Level_One As TreeNode = Nothing
            Dim Level_Two As TreeNode = Nothing
            Dim Level_Three As TreeNode = Nothing
            Dim ParentNode As TreeNode = Nothing
            Dim Child_Level As TreeNode = Nothing
     
            Dim sql As String = "SELECT * FROM REFERENTIEL ORDER BY PARENT"
            Dim dr As System.Data.Common.DbDataReader = Nothing
     
            Dim twRoot As String = String.Empty
            Dim twChild As String = String.Empty
            Dim parent As String = String.Empty
            Dim node_text As String = String.Empty
     
            Try
     
                dr = DBUtils.dbInfo.DBUtils.ExecuteReader(CommandType.Text, sql)
     
                While dr.Read
                    Articles(I_Article).ID = dbConversion.ConvertToInt32(dr.Item(0))
                    Articles(I_Article).Libelle = dr.Item(1).ToString
                    Articles(I_Article).Parent = dbConversion.ConvertToInt32(dr.Item(2))
     
                    I_Article += 1
     
                    parent = dr.Item(2).ToString
                    If parent = "0" Then
                        twRoot = dr.Item(1).ToString
                        Root_Level = New TreeNode
                        Root_Level = TreeViewEx1.Nodes.Add(twRoot)
                        Root_Level.Tag = dr.Item(0).ToString
                    Else
                        ' Vérification existance niveau 1
                        Dim idParent As String = dr.Item(2).ToString
     
                        ParentNode = FindParent(idParent, TreeViewEx1.Nodes)
                        twChild = dr.Item(1).ToString
                        Level_One = ParentNode.Nodes.Add(twChild)
                    End If
                End While
            Catch ex As Exception 'logs.logs.WriteToLog(ex.ToString)
                Return
            Finally
                If Not dr Is Nothing Then dr.Close()
            End Try
        End Sub
    et ensuite celui de ma fonction pour rechercher le parent :
    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
    ' Function pour rechercher le parent dans le treeview
        Function FindParent(ByVal strSearch As String, ByVal Nodes As TreeNodeCollection) As TreeNode
            Dim ret As TreeNode
     
            '~~> Loop through each TreeNode
            For Each TrNode As TreeNode In Nodes
                Dim nod_tag As String = TrNode.Tag.ToString
     
                '~~> Compare node text with search text
                'If TrNode.Text = strSearch Then
                If nod_tag = strSearch Then
                    Return TrNode
                End If
     
                '~~> Do recursive search if there are child nodes
                If TrNode.Nodes.Count > 0 Then
                    ret = FindParent(strSearch, TrNode.Nodes)
                    If Not ret Is Nothing Then
                        Return ret
                    End If
                End If
            Next
            Return Nothing
        End Function
    Et voici un apercu de ma base
    ID // LIBELLE // ID_PARENT
    1 // MENUS - BUFFETS // 0
    2 // PRODUIT // 0
    3 // DIVERS // 0
    4 // MENU 1 PLAT // 1
    5 // MENU 2 PLATS // 1
    6 // MENU CEREMONIE - PRESTIGE // 1
    7 // ENTREE // 2

  2. #2
    Membre habitué Avatar de LeCygne
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2010
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2010
    Messages : 91
    Points : 159
    Points
    159
    Par défaut Peut être un problème d'algorithme ?
    Bonjour,

    Ce serait bien de nous dire à quelle ligne de votre exemple l'erreur survient, et avec quel message.

    En lisant votre code la première interrogation qui me vient à l'esprit, est : Dans le cas d'un noeud de niveau différent de 0, comment êtes vous certain que son parent est déjà dans le treeview et que vous pouvez l'y "accrocher" ?

    Je vois bien un "ORDER BY PARENT" dans la requette, mais cela ne suffit pas à vous garantir que le parent du noeud en cours de traitement à lui-même déjà été traité. Imaginez le cas suivant (Le symbole "=>" signifiant "à pour enfant") :

    Racine (0) => Noeud 7 => Noeud 2 => Noeud 5
    - Le noeud 5 à pour parent le noeud 2
    - Le noeud 2 à pour parent le noeud 7
    - Donc le noeud 5 sortira du datareader avant le noeud 2.
    - Donc son parent sera absent au momment où il sera créé.

    Dans un tel cas, la methode "FindParent" (utilisé à la ligne 50 dans l'exemple) retourne nothing dans "ParentNode" et un plantage survient lorsque cette variable est utilisée (ligne 52).

    Bonne continuation et merci de votre retour.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    hormis le problème, il ne faut pas faire une recherche du parent, c'est peu performant, et vous venez de les ajouter les noeuds ca serait bête de les chercher

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private _dicoNodes as new dictionary(of type_clé, treenode)
    quand vous ajoutez un noeud, vous l'ajoutez aussi au dictionnaire
    quand vous devez ajouter un noeud à un autre vous pouvez récupérer le parent et faire _dicoNodes(l'idparent).nodes.add

    le mieux pour remplir un treeview est de faire une requete récursive, mais ca peut faire peur au début

    s'il y a beaucoup d'élements, une requete par niveau reste performant sans pénaliser l'interface
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 161
    Points : 86
    Points
    86
    Par défaut
    Bonjour,

    Bon j'avoue, jeune débutant j'ai pris du code sur internet que j'ai essayé d'adapter à mon cas.

    Je n'avais pas de message d'erreur c'est juste que ça ne rentrait pas dans mon 2e dossier racine j'ai ma fonction findparent qui effectivement me renvoi nothing puis sort de la fonction.

    J'ai donc vu avec un ami beaucoup plus calé que moi car je ne voulais pas faire un copié collé de son code mais voulais essayer de comprendre le fonctionnement.

    J'ai refait le point avec lui puis j'ai fait différemment avec 3x moins de code.

    Merci pour ton commentaire qui m'a permis d'élargir un peu ma vision de la réflexion car effectivement, bien que je fasse un "ORDER BY" dans ma requête je n'avais pas pensé a ce que tu m'a décris comme situation possible.

    La négligence du débutant ;-)

    En tout cas merci.


    Citation Envoyé par LeCygne Voir le message
    Bonjour,

    Ce serait bien de nous dire à quelle ligne de votre exemple l'erreur survient, et avec quel message.

    En lisant votre code la première interrogation qui me vient à l'esprit, est : Dans le cas d'un noeud de niveau différent de 0, comment êtes vous certain que son parent est déjà dans le treeview et que vous pouvez l'y "accrocher" ?

    Je vois bien un "ORDER BY PARENT" dans la requette, mais cela ne suffit pas à vous garantir que le parent du noeud en cours de traitement à lui-même déjà été traité. Imaginez le cas suivant (Le symbole "=>" signifiant "à pour enfant") :

    Racine (0) => Noeud 7 => Noeud 2 => Noeud 5
    - Le noeud 5 à pour parent le noeud 2
    - Le noeud 2 à pour parent le noeud 7
    - Donc le noeud 5 sortira du datareader avant le noeud 2.
    - Donc son parent sera absent au momment où il sera créé.

    Dans un tel cas, la methode "FindParent" (utilisé à la ligne 50 dans l'exemple) retourne nothing dans "ParentNode" et un plantage survient lorsque cette variable est utilisée (ligne 52).

    Bonne continuation et merci de votre retour.

  5. #5
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 161
    Points : 86
    Points
    86
    Par défaut
    Bonsoir, en fait j'ai créé une classe myObject avec les paramètres id, libelle et parentID.

    Puis ensuite j'ai fait ma requête SQL pour récupérer tout mes objets.

    Et ensuite je construit mon treeview.

    Merci de ton aide.

    Cordialement

    Citation Envoyé par Pol63 Voir le message
    hormis le problème, il ne faut pas faire une recherche du parent, c'est peu performant, et vous venez de les ajouter les noeuds ca serait bête de les chercher

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private _dicoNodes as new dictionary(of type_clé, treenode)
    quand vous ajoutez un noeud, vous l'ajoutez aussi au dictionnaire
    quand vous devez ajouter un noeud à un autre vous pouvez récupérer le parent et faire _dicoNodes(l'idparent).nodes.add

    le mieux pour remplir un treeview est de faire une requete récursive, mais ca peut faire peur au début

    s'il y a beaucoup d'élements, une requete par niveau reste performant sans pénaliser l'interface

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

Discussions similaires

  1. manipuler une BDD SQL via l'API ODBC sur builder C+
    Par débutant11 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/06/2010, 20h34
  2. Mise à jour BDD SQL via DataGridView
    Par Alexis_W dans le forum Windows Forms
    Réponses: 6
    Dernier message: 06/01/2009, 12h37
  3. [C# & MySql] Création BDD via script .sql
    Par Saten dans le forum Windows Forms
    Réponses: 1
    Dernier message: 26/11/2008, 11h18
  4. Remplissage d'une table via requete SQL
    Par PyMon dans le forum WinDev
    Réponses: 3
    Dernier message: 11/06/2008, 12h08
  5. Accéder à une bdd SQL server via un pc distant
    Par shako95 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/12/2005, 22h38

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