Comment faire pour utiliser les capacités de glisser-déplacer du contrôle TreeView dans Access 2000

Cet article peut contenir des liens vers des informations en langue anglaise (pas encore traduites).
Pour vous procurer une version Microsoft Access 97, reportez-vous à l'article 165993 .
Utilisateurs confirmés : exige de très bonnes compétences en programmation, en interopérabilité et dans le domaine multi-utilisateur.

Résumé

Cet article explique comment utiliser la fonctionnalité glisser-déplacer dans le contrôle Microsoft TreeView version 6.0.

Le contrôle Microsoft TreeView version 6.0 est fourni avec Microsoft Office 2000 Developer.

Microsoft fournit des exemples de programmation à titre indicatif uniquement, sans garantie explicite ou implicite. Cela inclut notamment les garanties implicites de qualité ou d'adéquation à un usage particulier. Pour bien comprendre cet article, vous devez connaître le langage de programmation présenté et les outils utilisés pour créer et déboguer des procédures. Les techniciens du Support technique Microsoft peuvent vous expliquer les fonctionnalités d'une procédure particulière, mais ils ne modifieront pas ces exemples pour vous fournir des fonctionnalités supplémentaires ou créer des procédures répondant à vos besoins spécifiques.

Plus d'informations

Le contrôle Microsoft TreeView version 6.0 possède une fonctionnalité glisser-déplacer intégrée qui n'était pas disponible dans les versions antérieures. Il prend en charge des événements glisser-déplacer, tels qu'OLEStartDrag, OLEDragOver, OLECompleteDrag et OLEDragDrop.

L'exemple suivant crée une liste hiérarchique d'employés dans l'exemple de base de données Les Comptoirs. Le contrôle TreeView affiche les employés en fonction de leur supérieur hiérarchique et vous permet de faire glisser des noms d'employés afin de reclasser la hiérarchie et de mettre à jour la table sous-jacente.

ATTENTION : en suivant les procédures de cet exemple, la base de données exemple Comptoir.mdb sera modifiée. Vous pouvez sauvegarder le fichier Comptoir.mdb et exécuter ces procédures sur une copie de la base de données.
  1. Démarrez Microsoft Access et ouvrez l'exemple de base de données Comptoir.mdb.
  2. Créez en mode Création un nouveau formulaire basé sur aucune table ni requête.
  3. Dans le menu Insertion, cliquez sur Contrôle ActiveX.
  4. Dans la boîte de dialogue Insérer un contrôle ActiveX, sélectionnez Microsoft TreeView Control 6.0, puis cliquez sur OK.
  5. Définissez les propriétés suivantes pour le contrôle TreeView :

    Nom : xTree
    Largeur : 3"
    Hauteur : 2"
  6. Double-cliquez sur le contrôle TreeView et définissez les propriétés personnalisées suivantes sous l'onglet Général de la boîte de dialogue Propriétés de TreeCtrl :

    Style : 6 - tvwTreelinesPlusMinusText
    LineStyle : 1 - tvwRootLines
    OLEDragMode : 1 - ccOLEDragAutomatic
    OLEDropMode : 1 - ccOLEDropManual
  7. Cliquez sur OK.
  8. Enregistrez le formulaire en tant que TreeViewTest.
  9. Dans le menu Affichage, cliquez sur Code.
  10. Tapez les procédures suivantes :
    '==================================================================
    'This procedure populates the TreeView control when the form opens.
    '==================================================================
    Private Sub Form_Load()
    On Error GoTo ErrForm_Load

    Dim db As Database
    Dim rst As Recordset
    Dim nodCurrent As Node, nodRoot As Node
    Dim objTree As TreeView
    Dim strText As String, bk As String

    Set db = CurrentDb

    'Open the Employees table.
    Set rst = db.OpenRecordset("Employees", dbOpenDynaset, dbReadOnly)

    'Create a reference to the TreeView Control.
    Set objTree = Me!xTree.Object

    'Find the first employee who is a supervisor.
    rst.FindFirst "[ReportsTo] Is Null"

    'Build the TreeView list of supervisors and their employees.
    Do Until rst.NoMatch
    'Extract the supervisor's name.
    strText = rst![LastName] & (", " + rst![FirstName])
    'Add a root level node to the tree for the supervisor.
    Set nodCurrent = objTree.Nodes.Add(, , "a" & rst!EmployeeID, _
    strText)
    'Use a placeholder to save this place in the recordset.
    bk = rst.Bookmark
    'Run a recursive procedure to add all the child nodes
    'for employees who report to this supervisor.
    AddChildren nodCurrent, rst
    'Return to your placeholder.
    rst.Bookmark = bk
    'Find the next supervisor.
    rst.FindNext "[ReportsTo] Is Null"
    Loop

    ExitForm_Load:
    Exit Sub

    ErrForm_Load:
    MsgBox Err.Description, vbCritical, "Form_Load"
    Resume ExitForm_Load
    End Sub

    '===================================================================
    'This procedure adds child nodes to the tree for all employees who
    'report to a particular supervisor, and calls itself recursively
    'to add child nodes for all other employees they supervise.
    '
    'Note that this procedure accepts the open Employees recordset by
    'reference so you do not have to open a new recordset for each call.
    '===================================================================
    Sub AddChildren(nodBoss As Node, rst As Recordset)
    On Error GoTo ErrAddChildren

    Dim nodCurrent As Node
    Dim objTree As TreeView
    Dim strText As String, bk As String

    'Create a reference to the TreeView control.
    Set objTree = Me!xTree.Object
    'Find the first employee who reports to the supervisor for this node.
    rst.FindFirst "[ReportsTo] =" & Mid(nodBoss.Key, 2)
    'Build the list of employees who report to this supervisor.
    Do Until rst.NoMatch
    'Extract the employee's name.
    strText = rst![LastName] & (", " + rst![FirstName])
    'Add as a child node to the tree.
    Set nodCurrent = objTree.Nodes.Add(nodBoss, tvwChild, "a" & _
    rst!EmployeeID, strText)
    'Save your place in the recordset.
    bk = rst.Bookmark
    'Add any employees for whom the current node is a supervisor.
    AddChildren nodCurrent, rst
    'Return to your place in the recordset and continue to search.
    rst.Bookmark = bk
    'Find the next employee who reports to this supervisor.
    rst.FindNext "[ReportsTo]=" & Mid(nodBoss.Key, 2)
    Loop

    ExitAddChildren:
    Exit Sub

    ErrAddChildren:
    MsgBox "Can't add child: " & Err.Description, vbCritical, _
    "AddChildren(nodBoss As Node) Error:"
    Resume ExitAddChildren
    End Sub

    '==================================================================
    'This procedure in the OLEStartDrag event of the TreeView control
    'clears the selected node so you can choose a new one.
    '==================================================================
    Private Sub xTree_OLEStartDrag(Data As Object, AllowedEffects As _
    Long)
    Me!xTree.Object.SelectedItem = Nothing
    End Sub

    '====================================================================
    'Use the OLEDragOver event of the TreeView control to select the
    'node to drag, and to highlight the target nodes where the drop will
    'occur when you release the mouse. This procedure sets the selected
    'node to drag once. After that, if a node is already selected, the
    'procedure assumes it was set during an earlier call in the dragging
    'process and it does not reset it. The second half of this procedure
    'highlights the node you are dragging over.
    '====================================================================
    Private Sub xTree_OLEDragOver(Data As Object, Effect As Long, _
    Button As Integer, Shift As Integer, x As Single, y As Single, _
    State As Integer)
    Dim oTree As TreeView

    'Create a reference to the TreeView control.
    Set oTree = Me!xTree.Object

    'If no node is selected, select the first node you dragged over.
    If oTree.SelectedItem Is Nothing Then
    Set oTree.SelectedItem = oTree.HitTest(x, y)
    End If

    'Highlight the node being dragged over as a potential drop target.
    Set oTree.DropHighlight = oTree.HitTest(x, y)
    End Sub

    '==================================================================
    'The OLEDragDrop event moves the selected node on the TreeView
    'control to its new location and changes the corresponding record in
    'the Employees table. The procedure first checks that the TreeView
    'has a selected node. If so, it continues to check if a drop target
    'node is highlighted. If no node is highlighted, then the user has
    'dragged the node off the tree and dropped it into a blank area, and
    'the procedure adds a branch to the root of the tree. If a node is
    'highlighted, the procedure modifies the Employee table's ReportTo
    'field accordingly and sets the selected node's parent property
    'to the node that has the drop highlight.
    '==================================================================
    Private Sub xTree_OLEDragDrop(Data As Object, Effect As Long, _
    Button As Integer, Shift As Integer, x As Single, y As Single)
    On Error GoTo ErrxTree_OLEDragDrop

    Dim oTree As TreeView
    Dim strKey As String, strText As String
    Dim nodNew As Node, nodDragged As Node
    Dim db As Database
    Dim rs As Recordset

    Set db = CurrentDb

    'Open the Employees table for editing.
    Set rs = db.OpenRecordset("Employees", dbOpenDynaset)

    'Create a reference to the TreeView control.
    Set oTree = Me!xTree.Object

    'If nothing is selected for drag, do nothing.
    If oTree.SelectedItem Is Nothing Then
    Else
    'Reference the selected node as the one being dragged.
    Set nodDragged = oTree.SelectedItem
    'If the node was dragged to an empty space, update the
    'Employees table and make this employee a root node.
    If oTree.DropHighlight Is Nothing Then
    'Save the key and the text to use when you re-add the node.
    strKey = nodDragged.Key
    strText = nodDragged.Text
    'Delete the current node for the employee.
    oTree.Nodes.Remove nodDragged.Index
    'Locate the record in the Employees table and update it.
    rs.FindFirst "[EmployeeID]=" & Mid(strKey, 2)
    rs.Edit
    rs![ReportsTo] = Null
    rs.Update
    'Add this employee as a root node.
    Set nodNew = oTree.Nodes.Add(, , strKey, strText)
    'Add all the child nodes for this employee.
    AddChildren nodNew, rs
    'If you are not dropping the node on itself.
    ElseIf nodDragged.Index <> oTree.DropHighlight.Index Then
    'Set the drop target as the selected node's parent.
    Set nodDragged.Parent = oTree.DropHighlight
    'Locate the record in the Employees table and update it.
    rs.FindFirst "[EmployeeID]=" & Mid(nodDragged.Key, 2)
    rs.Edit
    rs![ReportsTo] = Mid(oTree.DropHighlight.Key, 2)
    rs.Update
    End If
    End If

    'Deselect the node
    Set nodDragged = Nothing

    'Unhighlight the nodes.
    Set oTree.DropHighlight = Nothing

    ExitxTree_OLEDragDrop:
    Exit Sub

    ErrxTree_OLEDragDrop:
    'If you create a circular branch.
    If Err.Number = 35614 Then
    MsgBox "A supervisor cannot report to a subordinate.", _
    vbCritical, "Move Cancelled"
    Else
    MsgBox "An error occurred while trying to move the node. " & _
    "Please try again." & vbCrLf & Error.Description
    End If
    Resume ExitxTree_OLEDragDrop
    End Sub
  11. Dans le menu Débogage, cliquez sur Compiler Comptoir.
  12. Fermez Microsoft Visual Basic Editor et basculez le formulaire en mode Formulaire. Entraînez-vous à faire glisser et à déposer des noms d'employés dans le contrôle TreeView et remarquez la façon dont l'arborescence et la table Employés sont mises à jour avec les nouvelles informations.

Références

Pour plus d'informations sur l'utilisation du contrôle TreeView, dans Visual Basic Editor, cliquez sur Aide sur Microsoft Visual Basic dans le menu ? (Aide), tapez Contrôle TreeView dans le Compagnon Office ou dans l'Aide intuitive, puis cliquez sur Rechercher pour afficher la rubrique correspondante.

Pour plus d'informations sur le contrôle TreeView, consultez l'article suivant dans la Base de connaissances Microsoft :
162523 Migration du contrôle Structure des données vers le contrôle TreeView
Pour plus d'informations sur l'utilisation de la récursivité dans Microsoft Access, dans Visual Basic Editor, cliquez sur Aide sur Microsoft Visual Basic dans le menu ? (Aide), tapez procédures récursives dans le Compagnon Office ou dans l'Aide intuitive, puis cliquez sur Rechercher pour afficher la rubrique correspondante.
Propriétés

ID d'article : 209898 - Dernière mise à jour : 11 oct. 2006 - Révision : 1

Commentaires