Access
 sql >> Teknologi Basis Data >  >> RDS >> Access

Atur ulang TreeView Nodes dengan Drag and Drop

Pengantar.

Saya harap Anda menemukan, tutorial minggu lalu tentang Kontrol ImageCombo berguna untuk Proyek Microsoft Access Anda. Dengan Kontrol ImageCombo TreeView, kita dapat membuat Menu Drop-down yang indah, dengan beberapa opsi, dan menampungnya dalam ruang kecil pada formulir.

Demikian juga, di sesi sebelumnya, kita telah mempelajari cara Menambahkan Node baru di lokasi tertentu pada hierarki node atau Menghapus Node dan menambahkan yang baru untuk merelokasi Node di Kontrol Tampilan Pohon.

Metode ini meminta pembuatan catatan baru di tabel sumber untuk simpul baru. Atau hapus rekaman yang ada dan buat yang baru untuk memindahkan simpul yang ada agar permanen. Di satu sisi, dengan menggunakan Fungsi Tambah/Hapus, kita bisa menambahkan Node baru atau mengatur ulang Node yang ada di TreeView Control. Sejauh menyangkut mengatur ulang Node, kami memiliki cara yang lebih baik untuk melakukannya, daripada menghapus Node dan membuatnya kembali. Seret Node dari lokasinya saat ini dan Jatuhkan di tempat yang kita inginkan di Kontrol TreeView. Inilah yang akan kita pelajari di episode ini

Pendekatan sederhana ini hanya perlu memperbarui perubahan nilai bidang ParentID dari catatan terkait, untuk membuat perubahan itu permanen.

Topik yang Dibahas sejauh ini di Sesi Sebelumnya.

  1. Tutorial Kontrol Microsoft TreeView
  2. Membuat Menu Akses dengan Kontrol TreeView
  3. Menetapkan Gambar ke Kontrol TreeView
  4. Menetapkan Gambar ke TreeView Control-2
  5. TreeView Control Tanda Centang Tambah Hapus Node
  6. Menu Akses Drop-down TreeView ImageCombo

Namun, kita mungkin menghadapi beberapa tantangan saat menggunakan metode ini dan kita akan membahasnya nanti di Sesi ini.

Tabel dan Formulir Data Demo.

Kami membutuhkan Tabel dan Formulir. Kami sudah memiliki tabel yang sesuai dengan nama Contoh dibuat di Sesi tutorial sebelumnya. Jika Anda telah mengunduh Basis Data Demo, dari Halaman tautan kedua yang diberikan di atas sebelumnya, maka Anda dapat menggunakan Basis Data tersebut untuk Sesi ini juga. Kami akan menggunakan objek berikut dari Database itu untuk eksperimen Drag-Drop kami:

  • Tabel:Contoh
  • Formulir:frmSample

Gambar Kontrol TreeView di frmSample dengan data demo diberikan di bawah ini untuk referensi:

Anda dapat mengunduh Basis Data Demo (ProjectMenu.zip ) dari Halaman Tautan Kedua yang diberikan di atas dan ekstrak ProjectMenu.accdb basis data.

Formulir Baru untuk Uji Coba Drag Drop.

  1. Buka database ProjectMenu.accdb.

  2. Buat salinan tabel Contoh dan beri nama sebagai Sample_bk, tetap aman, kita akan membutuhkan data aslinya tanpa perubahan nanti. Saat kami bereksperimen dengan metode drag-drop, perlu untuk memperbarui nilai bidang ParentId pada Tabel demo Sampel. Tapi, kami membutuhkan data asli nanti, tanpa perubahan ini.

  3. Buat Formulir baru dengan nama frmDragDrop .

  4. Desain Formulir frmDragDrop akan terlihat seperti gambar yang diberikan di bawah ini setelah Anda menyelesaikannya.

  5. Masukkan Kontrol TreeView dari Daftar Kontrol ActiveX dan letakkan di formulir, sisakan cukup ruang di atas kontrol, sehingga kita dapat membuat dua Tombol Perintah dan Label Judul di atasnya. Seret gagang pengatur ukuran di sudut kanan bawah untuk membuatnya cukup besar untuk menampilkan semua Node, tanpa menggulir.

  6. Ubah Nama Nilai properti Kontrol TreeView menjadi TreeView0 .

  7. Masukkan Tombol Perintah di atas dan tepi kiri Kontrol TreeView. Ubah Namanya Nilai Properti menjadi cmdExpand dan Keterangan nilai untuk Luaskan Semua .

  8. Sisipkan Tombol Perintah kedua di atas dan ke tepi kanan Kontrol TreeView. Ubah Namanya Nilai Properti menjadi cmdCollapse dan Keterangan Nilai Properti untuk Ciutkan Semua.
  9. Sisipkan Kontrol Label di atas Tombol Perintah, cukup lebar untuk menulis Judul seperti yang ditunjukkan di atas, dan ubah Ukuran Font-nya 14.

  10. Abaikan Kontrol ImageList, untuk saat ini, saya telah mengomentari Baris Kode yang mengubah nomor indeks Node ImageList. Kemudian, Anda dapat Mengimpor Kontrol ImageList dengan Gambar yang diunggah secara manual, dari Database Demo Tutorial kami sebelumnya (dari Halaman Tautan ke-4 yang diberikan di atas) dan menggunakannya untuk menampilkan Node-Images di Node. Ketika posisi Node diubah selama tindakan Drag Drop, kita perlu mengubah Gambar Node juga tergantung pada posisi Node (Node tingkat Root atau Node Anak) pada Kontrol TreeView.

    Kode Modul Formulir Drag-Drop.

  11. Tampilkan Modul Kode VBA Formulir frmDragDrop, Salin dan Tempel Kode VBA berikut (ini hanya bagian pertama dari Kode Modul Formulir) ke dalam Modul Kelas Formulir frmDragDrop dan Simpan Formulir:

    Option Compare Database
    Option Explicit
    
    Dim tv As MSComctlLib.TreeView
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Dim imgListObj As MSComctlLib.ImageList
    Const KeyPrfx As String = "X"
    
    Private Sub Form_Open(Cancel As Integer)
    Set tv = Me.TreeView0.Object
    
    'Set imgListObj = Me.ImageList1.Object
    'tv.ImageList = imgListObj
    
    LoadTreeView
    
    End Sub
    
    Sub LoadTreeView()
    Dim strKey As String
    Dim strPKey As String
    Dim strText As String
    Dim strsQL As String
    
    strsQL = "SELECT * FROM Sample ORDER BY ID"
    
    Set db = CurrentDb
    Set rst = db.OpenRecordset(strsQL, dbOpenDynaset)
        
    tv.Nodes.Clear
    
    'Add all Items are added as Root Nodes
    Do While Not rst.BOF And Not rst.EOF
        strKey = KeyPrfx & CStr(rst!ID)
        strText = rst!desc
        tv.Nodes.Add , , strKey, strText
        
        'With tv.Nodes.Item(strKey)
        '    .Image = 1
        '    .SelectedImage = 4
        'End With
    
        rst.MoveNext
    Loop
    
    'Prepare to update the Parent-Key of Nodes
    'wherever applicable to move and position the Child Nodes
    strPKey = ""
    rst.MoveFirst
    Do While Not rst.EOF
        strPKey = Nz(rst!parentid, "")
        
        If Len(strPKey) > 0 Then
            strPKey = KeyPrfx & strPKey
            strKey = KeyPrfx & CStr(rst!ID)
            strText = rst!desc
            
            'Move the Child Node under it's Parent-Node
            Set tv.Nodes.Item(strKey).Parent = tv.Nodes.Item(strPKey)
            
    'Update Image and SelectedImage Properties
    'with ImageList Index numbers
            'With tv.Nodes.Item(strKey)
            '    .Image = 2
            '    .SelectedImage = 3
            'End With
    
        End If
        rst.MoveNext
    Loop
    
    rst.Close
    Set rst = Nothing
    Set db = Nothing
    
    End Sub
    
    
    Private Sub TreeView0_NodeClick(ByVal Node As Object)
    Dim SelectionNode As MSComctlLib.Node
        
    'Ensure that the clicked node equals the selected node in the tree
    If Not Node Is Nothing Then
        Set SelectionNode = Node
           If SelectionNode.Expanded = True Then
                SelectionNode.Expanded = False
            Else
                SelectionNode.Expanded = True
            End If
    End If
    End Sub
    
    Private Sub cmdCollapse_Click()
    Dim tmpnod As MSComctlLib.Node
    For Each tmpnod In tv.Nodes
        If tmpnod.Expanded = True Then
            tmpnod.Expanded = False
        End If
    Next
    
    End Sub
    
    Private Sub cmdExpand_Click()
    Dim tmpnod As MSComctlLib.Node
    For Each tmpnod In tv.Nodes
        If tmpnod.Expanded = False Then
            tmpnod.Expanded = True
        End If
    Next
    
    End Sub

    Saya tahu Anda sudah familiar dengan Kode di atas, jika Anda telah melalui Episode sebelumnya, kecuali LoadTreeView() subrutin dengan beberapa perubahan. Di sini, mengisi Node TreeView telah dibagi menjadi proses dua langkah.

    Secara singkat, inilah yang terjadi di Subrutin ini.

    • Semua catatan di Contoh Tabel telah dimuat sebagai Node tingkat Root dari TreeView Control, dengan nilai bidang ID sebagai Kunci, pada langkah pertama.

    • Sekali lagi, catatan ini telah dibaca untuk kedua kalinya dan periksa nilai dalam Id Orang Tua kolom, jika kosong maka Node akan dipertahankan sebagai Node tingkat Root.

    • Jika bidang ParentID memiliki Nilai, maka identifikasi Node dengan nilai ParentID sebagai Node-Key dan pindahkan Node saat ini sebagai Child Node-nya, atau [Relative] Parameter (dari Tambahkan () Metode) nilai diperbarui.

    • Meskipun tampaknya prosedur pengisian Node dua langkah adalah latihan yang tidak perlu, ada alasan bagus mengapa kita harus mengikuti metode ini. Kami akan kembali ke sini nanti dan Anda akan mengetahuinya tanpa banyak menjelaskan.

    • Pada Desain Formulir, saya telah memberikan Kontrol ImageList. Anda dapat memasukkan ImageList ActiveX Control dan unggah beberapa gambar di dalamnya secara manual dari disk, atau salin dan tempel kontrol ini dengan gambar dari Unduhan Basis Data Demo sebelumnya. Dalam kedua kasus tersebut, harap pastikan bahwa nama kontrol ImageList adalah ImageList1 . Jika tidak, Anda perlu mengubah nama dalam Kode.

    • Setelah itu, aktifkan baris komentar di Form_Open() Event Procedure. Aktifkan baris berikut, dengan menghapus simbol komentar dari awal baris:

      'Set imgListObj = Me.ImageList1.Object
      'tv.ImageList = imgListObj
      

    • Di TreeView0_ OLEDragDrop() Subrutin (di bagian ke-2 dari Kode VBA) mengaktifkan Parameter Indeks Gambar dari Node, dengan menghapus simbol Komentar dari baris tersebut juga. Dengan perubahan ini, Gambar Node akan muncul di Kontrol TreeView. Jika Anda memiliki Kontrol ImageList sendiri dengan Gambar yang diunggah, maka ubah Nomor Indeks berdasarkan Gambar apa yang ingin Anda sisipkan di Node.

      TreeView0_NodeClick() Event Procedure Memperluas node saat ini, jika Child-Node berada dalam keadaan diciutkan, jika tidak, Child Node akan diciutkan. Biasanya tindakan ini dikontrol (tanpa Kode) dengan mengklik +/- Simbol pada Garis Pohon Node dengan Node Anak.

      Subrutin cmdExpand_Click() dan cmdCollapse_Click() Events Memperluas semua Node dan menciutkan semua Node secara berurutan.

      Ketika Kode di atas Dijalankan tampilannya seperti Gambar Tampilan Formulir yang diberikan di bawah ini:

    • Anda dapat menyimpan frmDragDrop Bentuk dan buka dalam Tampilan Normal. Jika semuanya berjalan dengan baik maka Anda akan melihat layar di atas. Cobalah Luaskan Semua dan Ciutkan Semua Tombol Perintah dan periksa apakah mereka juga berfungsi. Jika tidak, maka periksa kembali pengaturan berikut ini benar atau tidak:

    • i) Nama Kontrol TreeView adalah:TreeView0

    • ii) Menampilkan Lembar Properti Exampand All Tombol Perintah dan pilih [Prosedur Acara] di Saat Klik Properti Acara.

    • iii) Pastikan bahwa pengaturan yang sama utuh untuk Ciutkan Semua Tombol Perintah juga.

    • iv) Klik pada Node, yang memiliki Node Anak, untuk melihat apakah Node tersebut diciutkan atau diperluas pada klik berulang.

    • v) Jika ImageList Control ditempatkan pada Form maka namanya harus ImageList1 .

      Mari kita lanjutkan dengan bagian kedua dari Kode VBA yang mengimplementasikan Acara Drag-Drop.

    Setengah Kedua dari Kode VBA.

  12. Salin Bagian Kedua Kode VBA berikut, pada Modul Formulir frmDragDrop, yang mengimplementasikan tindakan Drag-Drop, dan Tempel di bawah Kode yang ada:

    Private Sub TreeView0_OLEStartDrag(Data As Object, AllowedEffects As Long)
        Set Me.TreeView0.SelectedItem = Nothing
    End Sub
    
    
    Private Sub TreeView0_OLEDragOver(Data As Object, _
                                    Effect As Long, _
                                    Button As Integer, _
                                    Shift As Integer, _
                                    x As Single, _
                                    y As Single, _
                                    State As Integer)
        
        Dim SelectedNode As MSComctlLib.Node
        Dim nodOver As MSComctlLib.Node
        
        If tv.SelectedItem Is Nothing Then
            'Select a node if one is not selected
            Set SelectedNode = tv.HitTest(x, y)
            If Not SelectedNode Is Nothing Then
                SelectedNode.Selected = True
            End If
        Else
            If tv.HitTest(x, y) Is Nothing Then
            'do nothing
            Else
                'Highlight the node the mouse is over
                Set nodOver = tv.HitTest(x, y)
                Set tv.DropHighlight = nodOver
            End If
        End If
    
    End Sub
    
    
    Private Sub TreeView0_OLEDragDrop(Data As Object, _
                                        Effect As Long, _
                                        Button As Integer, _
                                        Shift As Integer, _
                                        x As Single, _
                                        y As Single)
    
        Dim sourceNode As MSComctlLib.Node
        Dim SourceParentNode As MSComctlLib.Node
        Dim targetNode As MSComctlLib.Node
        
        Dim tmpRootNode As MSComctlLib.Node
        Dim strtmpNodKey As String
        Dim ChildNode As MSComctlLib.Node
        
        Dim strSPKey As String
        Dim strTargetKey As String
        
        Dim strsQL As String
        Dim intKey As Integer
        Dim intPKey As Integer
        
        On Error Resume Next
        
        Select Case Screen.ActiveControl.Name
                
               Case TreeView0.Name
                    Set sourceNode = tv.SelectedItem
                
        End Select
        
        'Get Source Parent Node & Target Node Reference
        Set SourceParentNode = sourceNode.Parent
        Set targetNode = tv.HitTest(x, y)
                
        'If any errors then exit
        If Err <> 0 Then
            MsgBox Err & " : " & Err.Description, vbInformation + vbCritical, "OLEDragDrop()"
            Err.Clear
            Exit Sub
        Else
            On Error GoTo 0
        End If
        
    
        'Get/define Source parent Node Key to compare it with Target Node Key
        If SourceParentNode Is Nothing Then
            strSPKey = "Empty"
        Else
            strSPKey = SourceParentNode.Key
        End If
        
        'Check the Target Node/Location and define the Key
         Select Case True
            Case targetNode Is Nothing
                strTargetKey = "Empty"
            
            Case targetNode.Key = ""
                strTargetKey = "Empty"
                Set targetNode = Nothing
            Case Else
                strTargetKey = targetNode.Key
         End Select
        
        'Make sure the Target Node is not the source Node's own parent
        If strTargetKey = strSPKey Then Exit Sub
        
        'Track User's Node move action, check for error.
        On Error Resume Next
        
        If targetNode Is Nothing Then
            
            'If target Node is Nothing (the Node dropped in the empty area),
            'then the Node must be moved to the Root-level
            'save the original sourceNode.Key
            strtmpNodKey = sourceNode.Key
            
            'Modify the source Node Key, with addition of some text, say 'Empty', like 'X5Empty'
            'So that a temporary Node can be created with the original source Node key.
            'Note: Two Nodes with the same Key cannot remain in memory at the same time.
            'The Source Node with key 'X5Empty' deleted later,
            'temporary Node takes it's droped location.
            sourceNode.Key = sourceNode.Key & strTargetKey
    
            'Create the temporary Root Node, with original sourceNode Key
            Set tmpRootNode = tv.Nodes.Add(, , strtmpNodKey, sourceNode.Text)
            
            'define the Root Node image indexes
            'With tmpRootNode
            '    .Image = 1
            '    .SelectedImage = 4
            'End With
            
            'Move all child Nodes from SourceNode,if any,
            'as tmpRootNode's Children
            Do Until sourceNode.Children = 0
                Set sourceNode.Child.Parent = tmpRootNode
                
                'modify Node image indexes
                'With sourceNode
                '    .Image = 2
                '    .SelectedImage = 3
                'End With
            Loop
    
            'Delete the Source Node with modified Key from TreeView
            tv.Nodes.Remove sourceNode.Index
            
            'Move the tmpRootNode with original Key
            'to the dropped location on TreeView
            Set sourceNode = tmpRootNode
        Else
            'Move the sourceNode under targetNode as child
            Set sourceNode.Parent = targetNode
            
            'modify Node image indexes
            'With sourceNode
            '    .Image = 2
            '    .SelectedImage = 3
            'End With
        End If
        
        'Notify, if there was an Error then Exit, else Update PrentID of related Record.
        If Err <> 0 Then
            MsgBox Err & " : " & "Unable to move:" & vbCrLf & Err.Description, vbInformation + vbCritical, "DragDrop2()"
            Exit Sub
        Else
            'Build and execute the SQL statement to update the record
            If targetNode Is Nothing Then
                intKey = Val(Mid(sourceNode.Key, 2))
                strsQL = "UPDATE Sample SET ParentID = Null" & _
                         " WHERE ID = " & intKey
            Else
                intKey = Val(Mid(sourceNode.Key, 2))
                intPKey = Val(Mid(targetNode.Key, 2))
                
                strsQL = "UPDATE sample SET ParentID = " & intPKey & _
                         " WHERE ID = " & intKey
            End If
            
            'Modify the table records
            CurrentDb.Execute strsQL, dbFailOnError
            
            'If an error raised then refresh TreeView and exit
            If Err <> 0 Then
                MsgBox Err & " : " & Err.Description
                LoadTreeView 'Refresh/display TreeView without changes
            Else
                'Sort Nodes
                If sourceNode.Parent Is Nothing Then
                    sourceNode.Root.Sorted = True
                Else
                    sourceNode.Parent.Sorted = True
                End If
                
                tv.Nodes(sourceNode.Key).Selected = True
            End If
        End If
        On Error GoTo 0
    
    End Sub
    
    Private Sub TreeView0_OLECompleteDrag(Effect As Long)
    
        'Turn off the drophighlight
        Set tv.DropHighlight = Nothing
    
    End Sub
    
    Private Sub Form_Close()
    
    Set tv = Nothing
    End Sub

Untuk tindakan Drag-Drop, ada empat subrutin, mereka telah dieksekusi secara otomatis ketika Anda Drag Node(s), menyoroti Node ketika dipindahkan ke Node lain, dan akhirnya menjatuhkannya pada Node yang berbeda atau di area kosong tingkat Root .

Subrutin Utama Kode.

  • TreeView0_OLEStartDrag() - Menginisialisasi item yang dipilih dan menyetel Node menjadi Tidak Ada
  • TreeView0_OLEDragOver() - Bekerja seperti Mouse Move Event, menyorot Node, saat menyeret Node di atasnya, dalam perjalanan ke Target Node.
  • TreeView0_OLEDragDrop() – Melakukan pemeriksaan dan kontrol, memposisikan Node di Lokasi yang Dijatuhkan, dan memperbarui catatan di Tabel Dasar.
  • TreeView0_OLECompleteDrag() - Properti DropHighlight disetel ke Tidak Ada.

Kita dapat melakukan pekerjaan Drag and Drop dengan TreeView0_OLEDragDrop() Subrutin sendirian. Dalam hal ini, tidak akan ada sorotan Node, ketika Node Sumber berpindah ke Node lain, dari satu lokasi ke lokasi lain, kecuali bahwa Penunjuk Mouse berubah menjadi menyeret panah kedua di belakangnya, seperti pada contoh gambar yang diberikan di bawah ini. :

Jadi, kami akan memperhatikan subrutin ini dan memeriksa Kode secara detail dari awal. Di awal subrutin, kami telah mendeklarasikan Node dan String Variables yang diperlukan, dan lain-lain.

Alih-alih mengulangi analisis baris demi baris di sini, saya telah mengomentari setiap baris/bagian kode dengan tepat sehingga Anda akan memahami apa yang dilakukannya ketika Anda membaca Kode tersebut. Anda dapat melewatinya.

Urutan Acara Drap Drop

Mari kita memahami urutan Peristiwa, Pengguna Pilih sebuah Node, Menyeret Node lain dalam perjalanan ke tujuan akhirnya, dan Menjatuhkan pada Node Target. Atau Jatuhkan di area kosong pada Kontrol TreeView, untuk menjadikannya sebagai Node tingkat Root.

Saat Anda menyeret Node ke Node-Text lain, Node-Text akan disorot, mengatakan bahwa posisi Anda saat ini ada di Node ini dalam perjalanan, ke mana pun Anda pergi dari sini. Saat dipindahkan dari teks Node, sorotan menghilang. Ini terjadi sampai ke Target Node. TreeView0_OLEDragOver() Subrutin menangani tindakan penyorotan ini.

Saat Anda Menjatuhkan Node di suatu tempat TreeView0_OLEDragDrop() Subrutin membutuhkan biaya yang berlebihan. Di sini, kita harus menganalisis niat Pengguna dan mengambil tindakan yang tepat. Informasi berikut harus disimpan dan dianalisis untuk memindahkan Node ke lokasi yang benar.

Informasi Penting untuk Dilacak.

  1. Referensi Node Sumber, Nilai Node Key dan ParentID, Node Children, jika ada.

  2. Node Target atau Referensi lokasi, Kunci Node.

  3. Jika Target bukan Node tetapi area kosong dari TreeView Control, maka Source Node akan dipindahkan ke posisi level root.

  4. Node Sumber ketika Dijatuhkan di Node lain, Node Target menjadi Induk baru dari Node Sumber.

  5. Jika Source Node memiliki anak sendiri maka mereka juga harus dipindahkan dengan Induknya.

  6. ** Ketika Node diseret dan dijatuhkan pada Parent-Node-nya sendiri, maka Abaikan tindakan ini.

    ** Sebagai contoh, periksa gambar di atas. Jika kita menyeret TextBox Node dan jatuhkan ke parent-node Controls, atau seret Kontrol Node dan letakkan di FormSimpul Induknya maka gerakan tersebut akan diabaikan.

  7. ** Jika Tingkat akar Node diseret dan dijatuhkan ke area kosong, kemudian tidak ada tindakan yang akan diambil karena sudah menjadi Node tingkat Root.

Untuk semua gerakan Node yang valid, kita perlu memperbarui ParentID nilai bidang catatan terkait pada Contoh Tabel.

Penurunan Node di Area Kosong Tingkat Root.

Dalam hal nomor item 3 di atas, kita harus membuat Node tingkat Root, dengan Nomor ID yang sama dari Node Sumber, yang tidak diperbolehkan. Nilai Kunci Duplikat tidak diizinkan dalam hierarki TreeView. Ini adalah satu-satunya area Kode, di mana Anda akan menemukan sedikit kebingungan tentang prosedur yang diikuti di sana.

Prosedurnya seperti di bawah ini:

  1. Ubah Kunci Node TreeView yang ada dengan penambahan beberapa teks tambahan, (katakanlah Kunci X5 ubah ke X5Kosong ), untuk menghindari konflik Kunci, sambil membuat Node sementara dengan Kunci asli.

  2. Buat sementara Node dengan Kunci Asli:X5.

  3. Pindahkan semua Node Anak dari Node Sumber, jika ada, sebagai Node Anak ke Node Sementara.

  4. Hapus Node Sumber TreeView dengan Kunci yang dimodifikasi:X5Empty dari Kontrol TreeView, tetapi catatan terkait pada tabel Sampel tidak disentuh.

  5. Pindahkan sementara Node dengan Kunci Asli X5 dengan anak-anaknya ke posisi tingkat Root dari Kontrol TreeView.

  6. Perbarui bidang ParentID dari catatan terkait dengan string panjang nol (“”) untuk menandainya sebagai Node tingkat Root.

Eksperimen Self Drag Drop.

Anda dapat mencoba sendiri beberapa eksperimen Seret dan Jatuhkan dan lihat cara kerjanya. Pilih Node, klik dan tahan tombol kiri mouse, seret Node, dan letakkan di Node lain, atau letakkan di area kosong di TreeView Control. Saat Anda menyeret Node ke Node-Text lainnya, Node akan disorot dan saat Anda keluar dari Node, highlight akan padam. Node yang diseret akan muncul di lokasi baru tempat Anda menjatuhkannya. Anda dapat mengulangi eksperimen drag-drop ini dengan memilih satu Node atau Node with Children.

Berdasarkan pergerakan Node ini, ParentID record record terkait nilai bidang akan diperbarui dengan Kunci nilai (ID) dari catatan terkait Target Node.

Mengapa Prosedur Pengisian Node Dua Langkah?

Sekarang, kita akan kembali ke LoadTreeView() Subrutin, untuk melihat kedua proses dua langkah yang telah kita adopsi untuk mengisi semua Node ke Kontrol TreeView.

  • Semua catatan di Contoh Tabel awalnya ditambahkan sebagai Node tingkat-Akar, menggunakan nilai bidang ID sebagai Kunci-Node.

  • Pada catatan kedua, jika nilai bidang ParentID kosong maka Node tersebut akan tetap sebagai Node tingkat Root, tanpa perubahan.

  • Semua catatan terkait Node lainnya dengan Nilai ParentID dipindahkan dengan benar di bawah Node induknya.

Tentu, muncul pertanyaan, mengapa kita harus melakukannya dengan cara ini?

Kami akan melakukan percobaan sederhana untuk memperjelas jawabannya tanpa menjelaskannya dengan terlalu banyak kata. Anda mungkin telah melakukan beberapa uji coba drag and drop uji coba berjalan sendiri dan mengatur ulang Node, dalam proses memperbarui nilai ParentID record tersebut dengan perubahan. Jadi, kita perlu menyetel ulang nilai record ke keadaan semula di Contoh Tabel, sebelum kita memulai demo baru.

Kami telah membuat salinan Tabel Contoh sebelumnya, dengan nama Sample_bk sebagai cadangan. Hapus Contoh Tabel dan buat salinan dari Sample_bk dengan nama asli:Contoh .

Buka Tabel dan lihat catatan dan Nilai bidang ParentID mereka. Contoh Gambar Tabel diberikan di bawah ini:

Nilai Bidang ID adalah AutoNumber dan semuanya berurutan dan semua nilai Id unik. Aturan sederhana berikut mengatur penambahan Node Anak ke Kontrol TreeView.

Aturan Node Anak Sederhana: IndukID nilai bidang (Induk-Kunci ) dalam catatan mengharapkan bahwa Node Induk sudah ada di Kontrol TreeView, dengan nilai yang sama dengan Node-Key (ID).

Periksa catatan ketiga dari atas, pada Gambar Tabel di atas. Nilai bidang ParentID adalah 2 dan ID catatan saat ini adalah 3. Dalam hal ini, catatan dengan ID 2 akan ditambahkan ke Kontrol TreeView sebelum kita mencoba menambahkan catatan ketiga ke Node.js. Kedua catatan tidak harus bersebelahan. Periksa catatan dengan nomor ID 21, nilai bidang ParentID-nya adalah 12, kurang dari nilai ID catatan saat ini 21.

Dalam kedua kasus tersebut, ketika program menemukan Nilai ParentID dalam catatan, itu mengasumsikan bahwa catatan dengan nilai ID yang sama dengan ParentID telah ditambahkan sebagai Node di Kontrol TreeView dalam siklus pengisian Node sebelumnya.

Membenarkan Prosedur Dua Langkah.

Mari kita coba beberapa uji coba Drag-Drop. Tapi, sebelum itu, kita punya Form dengan nama frmSample, yang kami telah menggunakan di Sesi Tutorial pertama, dan di dalamnya kami telah memuat semua Node TreeView sekaligus. Ya, kami telah mengikuti metode yang sama sejauh ini dan kami membutuhkan beberapa perubahan mulai sekarang. Tapi, sebelum itu mari kita buka form lama dan lihat bagaimana Node muncul di Form.

  1. Buka Formulir frmSample untuk melihat bagaimana tampilan TreeView, dengan catatan tabel Contoh, dimuat menggunakan aturan lama.

  2. Jika Anda ingin melihat Node TreeView, tutup Formulir.

  3. Sekarang, Buka frmDragDrop Membentuk. Kami sedang bersiap untuk menarik dan melepas Node.

  4. Pilih Node dengan Node-Text Tabel, Klik dan tahan tombol kiri mouse, seret dan lepas di Node, dengan Form Teks Node.

  5. Tabel Node dengan Fields Simpul Anak langsungnya dan Node Anak-anaknya dipindahkan sebagai Node Anak di bawah Formulir Simpul.

  6. Tutup Formulir frmDragDrop dan buka lagi. Node akan muncul dengan benar, tempat Anda meletakkannya, seperti gambar di bawah ini.

  7. Sekarang, tutup Formulir frmDragDrop.

  8. Buka Formulir frmSample untuk melihat bagaimana perubahan ini muncul di Formulir ini. Anda akan disambut dengan pesan Kesalahan, Elemen Tidak Ditemukan dengan Nomor Kesalahan:35601.

  9. Pilih Tombol Perintah Debug untuk menuju ke baris Kode yang disorot, tempat Kesalahan terjadi.

  10. Arahkan mouse ke nodKey Param metode Add(), ini menunjukkan X3, titik mouse pada ParentKey parameter dan itu menunjukkan X7.

    Melihat kedua nilai parameter ini, kita dapat mengasumsikan bahwa kita berada pada catatan dengan nilai ID 3 dan mencoba untuk menunjuk Node ini sebagai Node anak, ke Node lain yang belum diisi ke dalam Kontrol TreeView, dengan nilai ID 7.

  11. Tekan F5 Tombol untuk memunculkan kembali kotak dialog yang sama dan Klik tombol End Command Button untuk menghentikan Program dan memunculkan Form pada Database Window. Tutup Formulir frmSample.

  12. Buka Contoh Tabel untuk melihat susunan ParentID Numbers, setelah kita melakukan aksi drag and drop. Catatan akan terlihat seperti gambar yang diberikan di bawah ini dan saya telah menyoroti catatan yang memicu Kesalahan dengan nilai ParentID 7 dan menunjukkan posisi rekaman Induknya.

Mengikuti Node sebelumnya yang mengisi prosedur normal, kami berada di posisi rekor ketiga. Karena, mencatat nilai ParentID 7, Nod dengan nilai ID 7 harus ada di Kontrol TreeView. Node dengan Nilai ID 7 belum diisi ke dalam Kontrol TreeView, tetapi kami mencoba untuk mereferensikan Node yang tidak ada dan ini memicu Kesalahan.

Bahkan jika Anda mengurutkan catatan di bidang ParentID, susunan catatan baru akan terlihat seperti gambar di bawah ini:

Sekarang, Parent Node record lain tidak berada di posisi yang diharapkan.

Oleh karena itu, dalam keadaan ini, pendekatan pemuatan TreeView Nodes dua langkah kami berfungsi baik untuk tindakan normal maupun setelah drag-drop.

Pada langkah pertama, isi semua catatan sebagai Node tingkat-Akar di Kontrol TreeView menggunakan nilai bidang ID sebagai Kunci-Node.

Sekarang, semua Node dari semua record tersedia di TreeView Control. Akan mudah untuk memindahkannya kemanapun kita mau. Itu tidak mengatakan bahwa Node yang diperlukan tidak ada di TreeView.

Pada lintasan kedua pada kumpulan catatan yang sama, catatan dengan nilai bidang ParentID kosong tidak tersentuh dan dibiarkan tetap sebagai Node tingkat-Akar. Dalam kasus lain, pindahkan Node sebagai Child-Node di bawah Parent Node-nya, dengan memperbarui [Relative] Parameter Node dengan Pernyataan berikut:

Set tv.Nodes.Item(strKey).Parent = tv.Nodes.Item(strPKey)

This is what we do through the second pass on the same set of records. You may do it by resetting the Record Pointer to the first record, by executing rst.MoveFirst before the Do . . . Loop, EOF conditions and rst.MoveNext to access each record as we normally do.

Second Step in Reverse Order.

Or you may do it in reverse order. After populating all records as Root-level Nodes the Record Pointer will be beyond the last record and on the EOF position. You may reset the record pointer to the last record, by executing rst.MoveLast before the Do . . . Loop BOF check, and execute rst.MovePrevious to access each record and move the Nodes correctly under its p arent Node. But, the Nodes may load slightly differently in the placement order of Nodes.

You may try this out yourself with the above-suggested change of Code and see the result.

Download Demo Database


  1. Modul Kelas MS-Access dan VBA
  2. Array Objek Kelas VBA MS-Access
  3. Kelas Dasar MS-Access dan Objek Turunannya
  4. Kelas Dasar VBA dan Objek Turunan-2
  5. Varian Kelas Dasar dan Objek Turunan
  6. MS-Access Recordset and Class Module
  7. Mengakses Modul Kelas dan Kelas Pembungkus
  8. Transformasi Fungsionalitas Kelas Wrapper


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan Navigasi Hanya Keyboard di Word, Excel, dan PowerPoint (Bagian 2:Kotak Dialog)

  2. Cara Membuat Bidang Terhitung di Access

  3. Cara Mengonversi Kueri Tab Silang kembali ke Kueri Normal di Access

  4. Menggunakan Tampilan SQL untuk Menambahkan/Mengedit Data di Microsoft Access

  5. 5 Alasan Microsoft Access Sangat Bagus untuk Startup