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 :

Chargement d'un Treeview à partir d'une bases de données SQL


Sujet :

VB.NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut Chargement d'un Treeview à partir d'une bases de données SQL
    Bonjour

    Est-ce que vous avez un exemple d'un treeview qui est chargé à partir des données d'une table SQL ?

    Je développe avec VB2008 et sql 2005

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Il faudrait que tu précises un peu le besoin... est-ce que c'est une seule table qui contient des données hiérarchiques ? ou alors une table différente pour chaque niveau de l'arborescence ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Il faudrait que tu précises un peu le besoin... est-ce que c'est une seule table qui contient des données hiérarchiques ? ou alors une table différente pour chaque niveau de l'arborescence ?
    Oui c'est 1 seule table.

    Cette table contient 3 colonnes :

    Nom : Varchar 25

    Role : integer 1

    Departement : Varchar 15

    Dans cette table on peut avoir plusieurs lignes du meme employé.

    Voici un extrait de la table :

    Nom Role Departement
    David 1 Textile
    David 1 Peinture
    David 2 Tabagie
    Stephane 3 Textile
    Stephane 5 Administration
    Et ainsi de suite

    Dans cet exemple voici l'arbre que je desire afficher

    +David
    +Stephane
    dans le noeud "David" voici ce qu'il y a :
    +1
    +2
    Dans le noeud "+1" on trouve les feuilles

    Textile
    peinture
    Dans le noeud "+2" on trouve la feuille
    Tabagie
    Même logique pour Stephane


    Merci

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    OK... ça va pas être super simple

    Le plus facile est sans doute d'utiliser Linq pour regrouper les données par employé et par role.

    On commence par créer une classe qui représente une ligne de la table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Class EmployeRoleDepartement
        Property Nom As String
        Property Role As Integer
        Property Departement As String
    End Class
    Ensuite on crée une méthode qui récupère une liste de EmployeRoleDepartement à partir de la db :

    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
    Function LoadEmployeRoleDepartement() As IEnumerable(Of EmployeRoleDepartement)
        Dim lst As New List(Of EmployeRoleDepartement)
        Using conn As New SqlConnection(connectionString)
            conn.Open()
            Using cmd As New SqlCommand("SELECT * FROM EmployeRoleDepartement", conn)
                Using reader As SqlDataReader = cmd.ExecuteReader()
                    While reader.Read()
                        Dim rec As New EmployeRoleDepartement()
                        rec.Nom = CType(reader("Nom"), String)
                        rec.Role = CType(reader("Role"), Integer)
                        rec.Departement = CType(reader("Departement"), String)
                        lst.Add(rec)
                    End While
                End Using
            End Using
        End Using
     
        return lst
    End Function

    Ensuite on regroupe les données par nom puis par role avec Linq :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Dim groupedData =
            From groupedByNom In From rec In LoadEmployeRoleDepartement() _
            Group rec By Nom = rec.Nom Into groupedByNom = Group _
            Select New With { _
                .Nom = Nom, _
                .Roles = _
                    From rec In groupedByNom _
                    Group rec By Role = rec.Role Into groupedByRole = Group _
                    Select New With { _
                        .Role = Role, _
                        .Departements = groupedByRole _
                    } _
            }
    (il y a sans doute une façon plus simple de l'écrire, mais je suis pas très familier avec la syntaxe Linq de VB.NET... en C# c'est un peu moins moche )

    Et pour finir, tu parcours la structure de données ainsi créée pour remplir le TreeView :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        For Each emp In groupedData
            Dim empNode = treeViewEmployes.Nodes.Add(emp.Nom)
            For Each role In emp.Roles
                Dim roleNode = empNode.Nodes.Add(role.Role.ToString())
                For Each dept In role.Departements
                    Dim deptNode = roleNode.Nodes.Add(dept.Departement)
                Next
            Next
        Next
    Bref... comme je disais, c'est pas super simple

    J'ai pas testé la partie qui charge les données à partir de la DB, il y aura peut-être 2 ou 3 trucs à corriger. Par contre le reste fonctionne

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par tomlev Voir le message
    OK... ça va pas être super simple

    Le plus facile est sans doute d'utiliser Linq pour regrouper les données par employé et par role.

    On commence par créer une classe qui représente une ligne de la table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Class EmployeRoleDepartement
        Property Nom As String
        Property Role As Integer
        Property Departement As String
    End Class
    Ensuite on crée une méthode qui récupère une liste de EmployeRoleDepartement à partir de la db :

    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
    Function LoadEmployeRoleDepartement() As IEnumerable(Of EmployeRoleDepartement)
        Dim lst As New List(Of EmployeRoleDepartement)
        Using conn As New SqlConnection(connectionString)
            conn.Open()
            Using cmd As New SqlCommand("SELECT * FROM EmployeRoleDepartement", conn)
                Using reader As SqlDataReader = cmd.ExecuteReader()
                    While reader.Read()
                        Dim rec As New EmployeRoleDepartement()
                        rec.Nom = CType(reader("Nom"), String)
                        rec.Role = CType(reader("Role"), Integer)
                        rec.Departement = CType(reader("Departement"), String)
                        lst.Add(rec)
                    End While
                End Using
            End Using
        End Using
     
        return lst
    End Function

    Ensuite on regroupe les données par nom puis par role avec Linq :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Dim groupedData =
            From groupedByNom In From rec In LoadEmployeRoleDepartement() _
            Group rec By Nom = rec.Nom Into groupedByNom = Group _
            Select New With { _
                .Nom = Nom, _
                .Roles = _
                    From rec In groupedByNom _
                    Group rec By Role = rec.Role Into groupedByRole = Group _
                    Select New With { _
                        .Role = Role, _
                        .Departements = groupedByRole _
                    } _
            }
    (il y a sans doute une façon plus simple de l'écrire, mais je suis pas très familier avec la syntaxe Linq de VB.NET... en C# c'est un peu moins moche )

    Et pour finir, tu parcours la structure de données ainsi créée pour remplir le TreeView :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        For Each emp In groupedData
            Dim empNode = treeViewEmployes.Nodes.Add(emp.Nom)
            For Each role In emp.Roles
                Dim roleNode = empNode.Nodes.Add(role.Role.ToString())
                For Each dept In role.Departements
                    Dim deptNode = roleNode.Nodes.Add(dept.Departement)
                Next
            Next
        Next
    Bref... comme je disais, c'est pas super simple

    J'ai pas testé la partie qui charge les données à partir de la DB, il y aura peut-être 2 ou 3 trucs à corriger. Par contre le reste fonctionne
    Merci tomlev pour ces infos.

    Y a t-il pas un autre exemple sans utiliser le "Linq' ?

    Peut-être va falloir créer un Dataset ou DataReader pour populer les donnees de la table et par la suite les lister par TreeNode.
    Qu'est ce que tu en penses ?

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par DEV-10 Voir le message
    Y a t-il pas un autre exemple sans utiliser le "Linq' ?
    Bah y a sûrement des exemples ailleurs, mais moi en tous cas j'ai pas envie d'en écrire un autre
    Qu'est-ce qui te gênes dans le fait d'utiliser Linq ? Faut juste apprendre, et une fois que tu connais ça simplifie bien la vie...
    D'ailleurs, pour pas introduire trop de nouveautés à la fois, j'ai pas parlé de Linq to SQL et d'Entity Framework, mais ça permettrait d'effectuer la requête Linq directement sur la base de données (sans passer par du SQL pour récupérer les données de la base)

    Citation Envoyé par DEV-10 Voir le message
    Peut-être va falloir créer un Dataset ou DataReader pour populer les donnees de la table et par la suite les lister par TreeNode.
    Qu'est ce que tu en penses ?
    J'en pense que oui, bien sûr tu peux faire ça, mais ça va être plus compliqué...
    Soit dit en passant, "populer les données de la table", le code que je t'ai donné le fait déjà (la méthode LoadEmployeRoleDepartement). Et ensuite, comment tu comptes t'y prendre pour "les lister par TreeNode" ? Parce que c'est ça la difficulté, pas le chargement des données...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Bah y a sûrement des exemples ailleurs, mais moi en tous cas j'ai pas envie d'en écrire un autre
    Qu'est-ce qui te gênes dans le fait d'utiliser Linq ? Faut juste apprendre, et une fois que tu connais ça simplifie bien la vie...
    D'ailleurs, pour pas introduire trop de nouveautés à la fois, j'ai pas parlé de Linq to SQL et d'Entity Framework, mais ça permettrait d'effectuer la requête Linq directement sur la base de données (sans passer par du SQL pour récupérer les données de la base)


    J'en pense que oui, bien sûr tu peux faire ça, mais ça va être plus compliqué...
    Soit dit en passant, "populer les données de la table", le code que je t'ai donné le fait déjà (la méthode LoadEmployeRoleDepartement). Et ensuite, comment tu comptes t'y prendre pour "les lister par TreeNode" ? Parce que c'est ça la difficulté, pas le chargement des données...

    Est-ce que Linq est sécuritaire ?

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par DEV-10 Voir le message
    Est-ce que Linq est sécuritaire ?
    Euh... c'est à dire ? Le terme "sécuritaire" s'utilise plutôt pour parler de politique que d'informatique

    Le code que je t'ai montré ne pose pas de problème de sécurité particulier ; c'est du Linq to Objects, donc ça fait grosso modo la même chose que tu aurais pu faire avec des boucles. Pour ce qui est de Linq to SQL ou Entity Framework, ça utilise des requêtes SQL paramétrées, donc ça protège contre les injections SQL.

    A part ce dernier point, Linq n'a pas vraiment d'impact sur la sécurité, que ce soit en bien ou en mal...

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Euh... c'est à dire ? Le terme "sécuritaire" s'utilise plutôt pour parler de politique que d'informatique

    Le code que je t'ai montré ne pose pas de problème de sécurité particulier ; c'est du Linq to Objects, donc ça fait grosso modo la même chose que tu aurais pu faire avec des boucles. Pour ce qui est de Linq to SQL ou Entity Framework, ça utilise des requêtes SQL paramétrées, donc ça protège contre les injections SQL.

    A part ce dernier point, Linq n'a pas vraiment d'impact sur la sécurité, que ce soit en bien ou en mal...
    Si on veut sortir le code SQL de VB et faire un appel à une procédure stockée qui contient :

    "SELECT * FROM EmployeRoleDepartement
    Qu'est ce qu'il faudrait changer dans le code ?

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par DEV-10 Voir le message
    Si on veut sortir le code SQL de VB et faire un appel à une procédure stockée qui contient :



    Qu'est ce qu'il faudrait changer dans le code ?
    http://dotnet.developpez.com/articles/ado1/vbnet/#L7

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    D'accord Tomlev je vais travailler tous ca et te revenir d'ici lundi si jamais j'aurais d'autres petites questions.

    Merci beaucoup pour ton aide.

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/02/2011, 12h57
  2. problème chargement d'un combo à partir d'une base de données
    Par reverse_engineer dans le forum Struts 1
    Réponses: 3
    Dernier message: 10/07/2008, 07h15
  3. Chargement TreeView à partir d'une base Firebird
    Par ameno_123 dans le forum Delphi
    Réponses: 2
    Dernier message: 05/02/2007, 07h50
  4. fichier XML à partir d'une base de données SQL
    Par MuldyMath dans le forum XQUERY/SGBD
    Réponses: 6
    Dernier message: 24/05/2006, 13h57

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