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.
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.
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 :
Et ainsi de suiteNom Role Departement
David 1 Textile
David 1 Peinture
David 2 Tabagie
Stephane 3 Textile
Stephane 5 Administration
Dans cet exemple voici l'arbre que je desire afficher
dans le noeud "David" voici ce qu'il y a :+David
+Stephane
Dans le noeud "+1" on trouve les feuilles+1
+2
Dans le noeud "+2" on trouve la feuilleTextile
peinture
Même logique pour StephaneTabagie
Merci
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 :
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 Class EmployeRoleDepartement Property Nom As String Property Role As Integer Property Departement As String End Class
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 :
(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 )
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 _ } _ }
Et pour finir, tu parcours la structure de données ainsi créée pour remplir le TreeView :
Bref... comme je disais, c'est pas super simple
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
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
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...
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...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager