Déplacer des nodes dans un treeview

Soyez le premier à donner votre avis sur cette source.

Vue 17 653 fois - Téléchargée 1 018 fois

Description

Ce petit bout de code permet de déplacer les nodes à l'intérieur d'un Treeview. J'ai réalisé ce code car j'en avait besoins... je désire donc le partager avec vous. Évidement, si jamais il y a une autre méthode plus "officielle", dîtes-moi le.

LIMITE :
Les sous-nodes des nodes déplacées sont transférées mais pas les sous-nodes de sous-nodes des nodes à tranférer.

Source / Exemple :


'/--------------------------------------------------'|>>Fait Par DeadlyPredator, Lundi le 27 Juin 2004<<|
'\--------------------------------------------------/
Public Enum NodeMoveType
NodeMoveChild = 0
NodeMoveParent = 1
NodeMoveFirst = 2
NodeMoveLast = 3
NodeMovePrevious = 4
NodeMoveNext = 5
End Enum
Public Sub NodeMove(ByVal TreeView As TreeView, ByVal SrcNode As Node, ByVal RefNode As Node, Optional ByVal RelationShip As NodeMoveType = NodeMoveFirst, Optional ByVal SelectNode As Boolean = True)
On Error Resume Next
Dim NewNode As Node, i As Long, Children As Collection

    If (SrcNode.Index = RefNode.Index) And (RelationShip = NodeMoveChild Or RelationShip = NodeMoveParent) Then Exit Sub 'LA NODE SE SUPPRIMERAIT...
    
    Select Case RelationShip
    Case 0 'NodeMoveChild
    Set NewNode = TreeView.Nodes.Add(RefNode.Index, tvwChild)
    Case 1 'NodeMoveParent
    Set NewNode = TreeView.Nodes.Add(RefNode.Parent.Index, tvwNext)
    Case 2 'NodeMoveFirst
    Set NewNode = TreeView.Nodes.Add(RefNode.FirstSibling.Index, tvwFirst)
    Case 3 'NodeMoveLast
    Set NewNode = TreeView.Nodes.Add(RefNode.LastSibling.Index, tvwLast)
    Case 4 'NodeMovePrevious
    Set NewNode = TreeView.Nodes.Add(RefNode.Previous.Index, tvwPrevious)
    Case 5 'NodeMoveNext
    Set NewNode = TreeView.Nodes.Add(RefNode.Next.Index, tvwNext)
    Case Else
    Exit Sub
    End Select
    
If Err.Number <> 0 Then Err.Clear: Exit Sub

    With NewNode
    .BackColor = SrcNode.BackColor
    .Bold = SrcNode.Bold
    .Checked = SrcNode.Checked
    .Expanded = SrcNode.Expanded
    .ExpandedImage = SrcNode.ExpandedImage
    .ForeColor = SrcNode.ForeColor
    .Image = SrcNode.Image
    .Key = SrcNode.Key
    .Sorted = SrcNode.Sorted
    .SelectedImage = SrcNode.SelectedImage
    .Tag = SrcNode.Tag
    .Text = SrcNode.Text
    End With

If SrcNode.Children <> 0 Then

Set Children = New Collection

    For i = SrcNode.Child.Index To SrcNode.Child.Index + SrcNode.Children - 1
    Children.Add TreeView.Nodes.Item(i)
    Next
    
TreeView.Nodes.Remove SrcNode.Index

    For i = 1 To Children.Count
    NodeMove TreeView, Children.Item(i), NewNode, NodeMoveChild, False
    Next
    
Set Children = Nothing

Else

TreeView.Nodes.Remove SrcNode.Index

End If

If SelectNode = True Then Set TreeView.SelectedItem = NewNode

Set NewNode = Nothing
End Sub

Conclusion :


Un peu complexe quand même. Avec ça, on voit la base des TreeViews aussi.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Mindiell
Messages postés
559
Date d'inscription
jeudi 25 juillet 2002
Statut
Membre
Dernière intervention
5 septembre 2007
1 -
Tu avais essaye le Drag'n'Drop pour voir ? :o)
DeadlyPredator
Messages postés
222
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
30 juin 2008
-
Drag/Drop?Je sais qu'avec ça, on peut déclencher un évènement qui renvoit un x, y de la node vers laquelle l'utilisateur veut déposer une node mais je crois pas que ça permet de déplacer. Si je me trompe, dîtes-moi le.
DeadlyPredator
Messages postés
222
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
30 juin 2008
-
J'ai réussi à permettre de déplacer aussi les sous-sous-nodes :
Public Sub NodeMove(ByVal TreeView As TreeView, ByVal SrcNode As Node, ByVal RefNode As Node, Optional ByVal RelationShip As NodeMoveType NodeMoveFirst, Optional ByVal SelectNode As Boolean True)
On Error Resume Next
Dim NewNode As Node, i As Long, j As Long, Children As Collection, SubChildren As SubChildrens, ChildrenNode As Node, SubChildrenNode As Node

If (SrcNode.Index RefNode.Index) And (RelationShip NodeMoveChild Or RelationShip = NodeMoveParent) Then Exit Sub 'LA NODE SE SUPPRIMERAIT...

Select Case RelationShip
Case 0 'NodeMoveChild
Set NewNode = TreeView.Nodes.Add(RefNode.Index, tvwChild)
Case 1 'NodeMoveParent
Set NewNode = TreeView.Nodes.Add(RefNode.Parent.Index, tvwNext)
Case 2 'NodeMoveFirst
Set NewNode = TreeView.Nodes.Add(RefNode.FirstSibling.Index, tvwFirst)
Case 3 'NodeMoveLast
Set NewNode = TreeView.Nodes.Add(RefNode.LastSibling.Index, tvwLast)
Case 4 'NodeMovePrevious
Set NewNode = TreeView.Nodes.Add(RefNode.Previous.Index, tvwPrevious)
Case 5 'NodeMoveNext
Set NewNode = TreeView.Nodes.Add(RefNode.Next.Index, tvwNext)
Case Else
Exit Sub
End Select

If Err.Number <> 0 Then Err.Clear: Exit Sub

With NewNode
.BackColor = SrcNode.BackColor
.Bold = SrcNode.Bold
.Checked = SrcNode.Checked
.Expanded = SrcNode.Expanded
.ExpandedImage = SrcNode.ExpandedImage
.ForeColor = SrcNode.ForeColor
.Image = SrcNode.Image
.Key = SrcNode.Key
.Sorted = SrcNode.Sorted
.SelectedImage = SrcNode.SelectedImage
.Tag = SrcNode.Tag
.Text = SrcNode.Text
End With

If SrcNode.Children <> 0 Then
'Save
Set Children = New Collection

For i = SrcNode.Child.Index To SrcNode.Child.Index + SrcNode.Children - 1
Set SubChildren = New SubChildrens
Set SubChildren.ParentNode = TreeView.Nodes.Item(i)
If SubChildren.ParentNode.Children <> 0 Then
For j = SubChildren.ParentNode.Child.Index To SubChildren.ParentNode.Child.Index + SubChildren.ParentNode.Children - 1
SubChildren.Children.Add TreeView.Nodes.Item(j)
Next
End If
Children.Add SubChildren
Set SubChildren = Nothing
Next
For i = 1 To Children.Count
Next
'\\'load
For i = 1 To Children.Count
Set ChildrenNode = TreeView.Nodes.Add(NewNode.Index, tvwChild)
With ChildrenNode
.BackColor = Children.Item(i).ParentNode.BackColor
.Bold = Children.Item(i).ParentNode.Bold
.Checked = Children.Item(i).ParentNode.Checked
.Expanded = Children.Item(i).ParentNode.Expanded
.ExpandedImage = Children.Item(i).ParentNode.ExpandedImage
.ForeColor = Children.Item(i).ParentNode.ForeColor
.Image = Children.Item(i).ParentNode.Image
.Key = Children.Item(i).ParentNode.Key
.Sorted = Children.Item(i).ParentNode.Sorted
.SelectedImage = Children.Item(i).ParentNode.SelectedImage
.Tag = Children.Item(i).ParentNode.Tag
.Text = Children.Item(i).ParentNode.Text
End With
For j = 1 To Children.Item(i).Children.Count
Set SubChildrenNode = TreeView.Nodes.Add(ChildrenNode.Index, tvwChild)
With SubChildrenNode
.BackColor = Children.Item(i).Children.Item(j).BackColor
.Bold = Children.Item(i).Children.Item(j).Bold
.Checked = Children.Item(i).Children.Item(j).Checked
.Expanded = Children.Item(i).Children.Item(j).Expanded
.ExpandedImage = Children.Item(i).Children.Item(j).ExpandedImage
.ForeColor = Children.Item(i).Children.Item(j).ForeColor
.Image = Children.Item(i).Children.Item(j).Image
.Key = Children.Item(i).Children.Item(j).Key
.Sorted = Children.Item(i).Children.Item(j).Sorted
.SelectedImage = Children.Item(i).Children.Item(j).SelectedImage
.Tag = Children.Item(i).Children.Item(j).Tag
.Text = Children.Item(i).Children.Item(j).Text
End With
Next
Set SubChildren = Nothing
Next

Set Children = Nothing
End If

TreeView.Nodes.Remove SrcNode.Index
If SelectNode True Then Set TreeView.SelectedItem NewNode

Set NewNode = Nothing
End Sub

Il faut par contre ajouter la classe SubChildrens :
Option Explicit

Public ParentNode As Node
Public Children As New Collection

Mais il y a encore un problème : quand on fait 1 déplacement, les sous-sous-nodes se copient comme il faut mais si on refait un autre déplacement avec la node, la sous-sous-node devient une sous-node.
rebelzkikione
Messages postés
5
Date d'inscription
mercredi 12 mars 2003
Statut
Membre
Dernière intervention
29 juin 2004
-
Hummm canard, sais - tu ke pour deplacer un node tu peux utiliser le .parent ? Le seul desavantage, c'est l'ordre du déplacement (le noeud deplacer devient le premier fils).

C'est bcp plus simple :) et ça te permettra d'utiliser le Tag(variant) de ton node pour mettre en relation une instance d'une classe... l'avantage c ke tu n'a po besoin de gerer destruction/creation d'un noeud ;)
cs_Arknoth
Messages postés
96
Date d'inscription
jeudi 2 janvier 2003
Statut
Membre
Dernière intervention
22 août 2004
-
Il aurait peut-être été intéressant d'avoir des bulles d'info en pointant les boutons, ca permettrai de mieux comprendre le fonctionnement.

Au Form_Load, tu aurais plutot du mettre une boucle For pour générer les nodes, avec la valeur Max en constante en début de projet.

Const cMaxNod = 8

For i = 1 To cMaxNod
.Add 1, tvwChild, , "noeudA" & CStr(i)
.Add 2, tvwChild, , "noeudB" & CStr(i)
EndFor

Autre chose :

Public Sub NodeMove(ByVal TreeView As TreeView

Esssaye d'éviter ce genre de déclaration où la variable est du nom de son type, ca provoque des erreurs

Sinon en effet, penche toi sur les fonctions, y a quelques bugs (notemment celui de faire d'un node enfant l'enfant d'un autre node, ca supprime le node enfant du premier)

A la rigueur, si tu t'en sens le courage, passe plutot par une fonction recursive, ca réduit le code au minimum et ca simplifie grandement le développement.

@pluche :p

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.