 |
Super-Logiciels pour vous |
 |
 |
Al Morakib Logiciel de serveillance par
camera et par internet ... | | | |
ALYASSIR Gestion simple et performante :
- Facturation
- BLs
- Devis
- Commandes
- Reglements
- Clients et fournisseurs | | | |
Al Fondoki Logiciel de la gestion
hôteliere:
Réservations, main courante, poits de vente, dépôts, occupation des chambres, ... | | | |
Morakib PC
| | | |
| Plus |
|
Avenue des F.A.R. Rsidence Niama N6 - Ttouan (Maroc)
Tl :(+212) 8 90 60 52 25
Fax :(+212) 5 39 97 25 15
Mobile :(+212) 6 61 10 74 37
Email :mce@meta-computer.com
|
|
|
|
Acceuil vb.net(508) VB dot NET et TreeView
|
| VB dot NET et TreeView |
2011-02-07 |
|
Comment charger l'arborescence de son disque dur dans un TreeView ?
------------------------------------------------------------------------------------------
Ce code permet de charger l'arborescence du disque dur C: dans un TreeView de la même façon que l'Explorateur Windows. Ce code nécessite un controle TreeView nommé TV et un Button nommé BTN.
Imports System
Imports System.IO
Imports System.Windows.Forms
'...
Private Sub Explorer(ByVal node As TreeNode)
Try
Dim s As String
node.Nodes.Clear()
For Each s In Directory.GetDirectories(node.FullPath)
node.Nodes.Add(Path.GetFileName(s))
Next
Catch
End Try
End Sub
Private Sub BTNClick(ByVal sender As Object, ByVal e As EventArgs)
TV.Nodes.Add("C:")
Explorer(TV.Nodes.Item(0))
End Sub
Private Sub TVAfterExpand(ByVal sender As Object, ByVal e As TreeViewEventArgs)
Dim tn As TreeNode
For Each tn In e.Node.Nodes
Explorer(tn)
Next
End Sub
Comment manipule-t-on le TreeView par le code ?
---------------------------------------------------------------------------
La manipulation de l'arborescence peut être assez complexe si le concept de nœuds n'est pas correctement assimilé. En fait les objets TreeNodes qui composent un objet TreeView sont des collections récursives. Les règles suivantes s'appliquent toujours :
•Il n'existe qu'un noeud 'Root'. On l'identifie par la valeur " Nothing " de son parent.
•Un noeud n'a toujours qu'un seul parent.
•Un noeud ne fournit des informations que sur ses descendants directs.
Comme il s'agit de collection récursive, le code suivant parcourt tous les nœuds enfants du nœud passé en paramètre :
Private Sub ParcoursNoeud(ByVal MonNode As TreeNode)
MsgBox(MonNode.ToString)
Dim MonEnum As IEnumerator = MonNode.Nodes.GetEnumerator
While MonEnum.MoveNext
ParcoursNoeud(CType(MonEnum.Current, TreeNode))
End While
End Sub
La position hiérarchique (parfois appelée niveau d'imbrication) n'est pas toujours simple à connaître. Pour la trouver, je peux utiliser une fonction récursive du type :
Private Function Niveau(ByVal MonNode As TreeNode, ByVal Start As Boolean) As Int32
Static Pos As Int32
If Start Then Pos = 0
If MonNode.Parent Is Nothing Then
Return Pos
Else
Pos += 1
Niveau(MonNode.Parent, False)
Return Pos
End If
End Function
Que j'appellerais par exemple avec :
MsgBox(Niveau(Me.TreeView1.SelectedNode, True).ToString)
Toutefois cette approche n'est souvent pas la meilleure car les procédures récursives sont coûteuses en ressources. Généralement, on connaît à priori le niveau hiérarchique lors de la construction. Il est alors rentable de le stocker dans la propriété Tag de l'objet TreeNode lors de la construction du TreeView.
Comment remplir un contrôle TreeView avec le schéma d'une base Access ?
-------------------------------------------------------------------------------------------------------------
Nous allons donc créer un remplissage d'un TreeView par la structure d'une base de données Access. Je vais le coder un peu lourd pour séparer l'extraction de la structure du remplissage du TreeView sans utiliser une collection fortement typée.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'code d'extraction de la structure
Dim lstStructure As New SortedList
Dim MaConn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:UserNWIND.MDB;")
MaConn.Open()
Dim schemaTables As DataTable = MaConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"})
Dim MonEnumColonne, MonEnumTable As IEnumerator
Dim schemaColTable As DataTable
Dim ListColonne As ArrayList
MonEnumTable = schemaTables.Rows.GetEnumerator
While MonEnumTable.MoveNext
schemaColTable = MaConn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, New Object() {Nothing, Nothing, CType(MonEnumTable.Current, DataRow).Item("Table_Name"), Nothing})
ListColonne = New ArrayList
MonEnumColonne = schemaColTable.Rows.GetEnumerator
While MonEnumColonne.MoveNext
ListColonne.Add(CType(MonEnumColonne.Current, DataRow).Item("column_name"))
End While
lstStructure.Add(CType(MonEnumTable.Current, DataRow).Item("Table_Name"), ListColonne)
End While
MaConn.Close()
'remplissage du treeview
Dim NodRoot, NodTable, NodTemp As TreeNode
NodRoot = Me.TreeView1.Nodes.Add("biblio.mdb")
NodRoot.ImageIndex = 0
Dim cmpt1, cmpt2 As Int32
Dim MonEnum As IEnumerator
For cmpt1 = 0 To lstStructure.Count - 1
NodTable = NodRoot.Nodes.Add(CType(lstStructure.GetKey(cmpt1), String))
MonEnum = CType(lstStructure.GetByIndex(cmpt1), ArrayList).GetEnumerator
While MonEnum.MoveNext
NodTemp = New TreeNode
With NodTemp
.Text = CType(MonEnum.Current, String)
.ImageIndex = 2
End With
NodTable.Nodes.Add(NodTemp)
NodTable.ImageIndex = 1
End While
Next
Me.TreeView1.ImageList = Me.ImageList1
End Sub
Comment déterminer le TreeNode survolé par la souris ?
-------------------------------------------------------------------------------
Il faut pour cela traiter l'évènement MouseMove du TreeView :
'''
''' Evènement MouseMove du treeView1
'''
Private Sub treeView1_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)
'Récupération du TreeNode survolé
Dim currentNode As TreeNode = treeView1.GetNodeAt(e.X, e.Y)
' Vérification que la souris survole bien un TreeNode
If Not (currentNode Is Nothing) Then
Console.WriteLine("Le node survolé est {0}", currentNode.Name)
End If
End Sub
Comment lister un répertoire dans une Treeview ?
-----------------------------------------------------------------------------
Ce bout de code permet de lister les fichiers et sous répertoires d'un répertoire spécifique. A la différence de ma source qui liste un répertoire dans une Listbox , cette méthode avec la TreeView permet de garder la hiérarchie de votre répertoire. Pour y parvenir, c'est un peu plus compliqué que pour la ListBox mais ce n'est pas si dur que ca.
Il faut créer une classe et coller le code ci dessous.
Imports System.IO
Public Class ListerRepertoire
Private TheTreeview As TreeView
Private Delegate Function TN_Delegate(ByVal a As TreeNode) As Int32
Public Sub New(ByVal TV As TreeView)
TheTreeview = TV 'affecte la Treeview
End Sub
Public Sub ListerMesRepertoire(ByVal Rep As String, ByVal Parent As TreeNode)
Try
'Récupère la liste des entrées du répertoire
Dim Liste As String() = Directory.GetFileSystemEntries(Rep)
Dim Entree As String
For Each Entree In Liste 'Pour chaque entrée de la liste
Dim TmpName As String = Microsoft.VisualBasic.Mid(Entree, Len(Rep) + 1) 'On découpe proprement le nom du fichier ou répertoire
TmpName = Microsoft.VisualBasic.Replace(TmpName, "", "") 'On enlève les caractères parasites !
If File.Exists(Entree) Then 'Si c'est un fichier
AddNode(TmpName, True, Parent) 'On crée un élément fichier dans le treeview
Else 'Si c'est un répertoire
Dim TmpNode As TreeNode 'Var tempo pour sauver le noeud du treeview
TmpNode = AddNode(TmpName, False, Parent) 'On ajoute le rep dans le treeview
ListerMesRepertoire(Entree, TmpNode) 'On liste le contenus de ce répertoire
End If
Next Entree
Catch Ex As System.UnauthorizedAccessException 'si le répertoire est protégé
Exit Sub
Catch e As Exception 'en cas d'erreurs
MsgBox("Erreur : " & e.Message, MsgBoxStyle.Critical)
End Try
End Sub
Private Function AddNode(ByVal StrNom As String, ByVal BlFile As Boolean, ByVal Parent As TreeNode) As TreeNode
Try
Dim TmpNode As TreeNode 'Noeud Pour les manipulations dans la function
If Not Parent Is Nothing Then ' Si Parent n'est pas à nothing
'TmpNode = Parent.Nodes.Add(Str_Nom) 'On crée un élément fils
Dim no As New TreeNode
no.Text = StrNom
With TheTreeview
.Invoke(New TN_Delegate(AddressOf Parent.Nodes.Add), New Object() {no})
End With
TmpNode = no
Else ' Si Parent Est à nothing c sans doute le premier élément du treeview ou une racine
'TmpNode = TreeView1.Nodes.Add(Str_Nom)
Dim no As New TreeNode
no.Text = StrNom
With TheTreeview
.Invoke(New TN_Delegate(AddressOf TheTreeview.Nodes.Add), New Object() {no})
End With
TmpNode = no
End If
Application.DoEvents() 'histoire de faire beau ^^ Non je pense que ca limitera le risque d'erreur
Return TmpNode
Catch ex As Exception
Return Nothing
MsgBox(ex.ToString)
End Try
End Function
End Class
Ensuite, il faut instancier votre classe et lui fournir le nom de votre Treeview comme argument :
Private c As ListerRepertoire
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
c = New ListerRepertoire(TreeView1) 'instancie la classe
c.ListerMesRepertoire("C:", Nothing) 'liste le répertoire
End Sub
Il ne vous reste plus qu'à apprécier la rapidité du code avec un petit backgroundworker pour voir la progression (sinon cela de freezer).
|
| Commentaires des visiteurs : |
|
|
|
|
|