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

ListView Control Drag Drop Penanganan Events

Pengantar.

Kita sudah familiar dengan operasi Drag and Drop pada TreeView Control, di Ms-Access yang mengatur ulang Nodes. Semua catatan dasar untuk Node Kontrol Treeview berasal dari Tabel Akses tunggal. Kami selalu memperbarui ParentID Node Sumber nilai bidang, dengan Nilai ID Node Target pada catatan Tabel yang sama, untuk membuat perubahan posisi pada Kontrol TreeView. Catatan tidak dipindahkan secara fisik ke mana pun.

Di sini, dengan penambahan Kontrol ListView bersama dengan Kontrol TreeView, kami berencana untuk bekerja dengan dua Tabel Akses yang berbeda.

  1. lvCategory – Kode dan Deskripsi Kategori.
  2. lvProducts – Kategori Produk.

Dengan cara ini lebih mudah untuk memahami hubungan antara kedua Tabel. Perubahan apa yang harus kita buat dan di mana, ketika satu Item Produk (item ListView) berpindah dari satu Kategori ke Kategori lainnya pada Kontrol TreeView.

lvCategory Access Table memiliki 20 record untuk TreeView Nodes dan lvProducts Tabel memiliki 45 untuk Kontrol ListView. Satu atau beberapa catatan di tabel Produk terkait langsung dengan kategori produk di Tabel Kategori. Hubungan antara keduanya telah diperbarui dengan nilai Bidang ID Kategori (CID) pada ID Induk Tabel Produk sehingga perubahan kategori produk langsung terlihat pada Kontrol ListView.

Tabel data demo diambil dari Microsoft Access Sample Database Northwind.accdb dan dibagi menjadi dua bagian.

Berdasarkan Nilai Bidang ParentID, dari catatan lvProduct, kita dapat memfilter dan membuat daftar semua item produk terkait di Kontrol ListView, ketika Node Kategori dipilih di Kontrol TreeView.

Topik yang telah kami bahas Sejauh ini.

Berikut ini adalah Topik utama di TreeView , Daftar Gambar , ImageCombo, dan ListView Kontrol, sejauh ini telah kita bahas di MS-Access:

  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
  7. Atur ulang Node TreeView dengan Seret dan Lepas
  8. Kontrol ListView dengan MS-Access TreeView

Tugas Drag-Drop ListView.

Sejauh menyangkut operasi Drag and Drop ListView, ini adalah latihan sederhana yang membandingkan metode yang sama dalam TreeView Control saja. Karena tindakan Seret Jatuhkan melibatkan Kontrol TreeView dan ListView, kami menggunakan Prosedur Peristiwa TreeView0_OLEDragDrop() yang sama dengan beberapa Kode VBA sederhana.

Item Produk yang terdaftar di Kontrol ListView milik item Kategori saat ini yang dipilih di Kontrol TreeView.

Pengguna memilih item produk tertentu dari Kontrol ListView, jika dia berpikir bahwa itu milik Item Kategori yang berbeda, lalu seret dan lepas item tersebut pada item Kategori target di TreeViewCcontrol.

Item Produk ListView yang dipindahkan akan ditambahkan ke daftar item yang termasuk dalam Kategori yang diubah. Nilai bidang ParentID catatan produk diperbarui dengan ID catatan Kategori target (nilai CID).

Ini hanya tindakan satu arah, selalu pindahkan item ListView dari satu kategori dan letakkan di Node Kategori yang berbeda pada Kontrol TreeView.

Formulir Akses demo seret-lepas ListView frmListViewDrag' s uji coba Gambar layar diberikan di bawah ini:

Pada Gambar di atas, Minuman Kategori pada TreeView telah dipilih. Produk yang termasuk dalam kategori Minuman telah terdaftar di ListView Control.

Tampilan Desain Form di atas:

Daftar nama Kontrol pada Formulir adalah sebagai berikut:

  1. Kontrol TreeView:TreeView0
  2. Kontrol ListView:ListView0
  3. Kontrol ImageList:ImageList3
  4. Tombol Perintah:cmdTutup

Kode VBA pada frmListViewDrag Modul Kelas:

Option Compare Database
Option Explicit

Dim tv As MSComctlLib.TreeView
Dim lvList As MSComctlLib.ListView
Dim imgList As MSComctlLib.ImageList
Const Prfx As String = "X"

Private Sub Form_Load()
Dim db As DAO.Database
Dim tbldef As TableDef

    Set tv = Me.TreeView0.Object
    tv.Nodes.Clear
    
    Set imgList = Me.ImageList3.Object
    
With tv
    .Font.Size = 9
    .Font.Name = "Verdana"
    .ImageList = imgList 'assign preloaded imagelist control
 End With
    
    Set lvList = Me.ListView0.Object
    lvList.ColumnHeaders.Clear
    lvList.ListItems.Clear
    lvList.Icons = imgList
    
    Set db = CurrentDb
    Set tbldef = db.TableDefs("lvProducts")
    
    'Initialize ListView & Column Headers Property Values
     With lvList
        .ColumnHeaderIcons = imgList
        .Font.Size = 9
        .Font.Name = "Verdana"
        .Font.Bold = False
        
        'ColumnHeaders.Add() Syntax:
        'lvList.ColumnHeaders.Add Index, Key, Text, Width, Alignment, Icon
        'Alignment: 0 - Left, 1 - Right, 2 - Center
        .ColumnHeaders.Add 1, , tbldef.Fields(1).Name, 2600, 0, 5
        .ColumnHeaders.Add 2, , tbldef.Fields(3).Name, 2600, 0, 5
        .ColumnHeaders.Add 3, , tbldef.Fields(4).Name, 1440, 1, 5
    End With
    
    Set db = Nothing
    Set tbldef = Nothing

    
   LoadTreeView 'Create TreeView Nodes

End Sub

Private Sub LoadTreeView()
    Dim Nod As MSComctlLib.Node
    Dim firstCatID As Long
    Dim strCategory As String
    Dim strCatKey As String
    Dim strBelongsTo As String
    Dim strSQL As String
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    
    'Initialize treeview nodes
     tv.Nodes.Clear
     
    'Initialize Listview nodes
    While lvList.ListItems.Count > 0
          lvList.ListItems.Remove (1)
    Wend
    
    strSQL = "SELECT lvCategory.CID, lvCategory.Category, "
    strSQL = strSQL & "lvcategory.BelongsTo FROM lvCategory ORDER BY lvCategory.CID;"
    
    Set db = CurrentDb
    Set rst = db.OpenRecordset(strSQL, dbOpenSnapshot)
    
    If Not rst.BOF And Not rst.EOF Then
        rst.MoveFirst
        firstCatID = rst!CID
    Else
        Exit Sub
    End If
    ' Populate all Records as Rootlevel Nodes
    Do While Not rst.BOF And Not rst.EOF
            strCatKey = Prfx & CStr(rst!CID)
            strCategory = rst!Category
            
            Set Nod = tv.Nodes.Add(, , strCatKey, strCategory, 1, 2)
            Nod.Tag = rst!CID
        rst.MoveNext
    Loop
    
    'In the second pass of the the same set of records
    'Move Child Nodes under their Parent Nodes
    rst.MoveFirst
    Do While Not rst.BOF And Not rst.EOF
        strBelongsTo = Nz(rst!BelongsTo, "")
        If Len(strBelongsTo) > 0 Then
            strCatKey = Prfx & CStr(rst!CID)
            strBelongsTo = Prfx & strBelongsTo
            strCategory = rst!Category
            
            Set tv.Nodes.Item(strCatKey).Parent = tv.Nodes.Item(strBelongsTo)
        End If
        rst.MoveNext
    Loop
    rst.Close
    
    ' Populate ListView Control with Product details
    ' of the first Category Item
    LoadListView firstCatID
    
End Sub


Private Sub LoadListView(ByVal CatID)
    Dim strProduct As String
    Dim strPKey As String
    Dim intcount As Integer
    Dim tmpLItem As MSComctlLib.ListItem
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Dim strSQL As String
    
    ' Initialize ListView Control
    While lvList.ListItems.Count > 0
        lvList.ListItems.Remove (1)
    Wend
   
     strSQL = "SELECT lvProducts.* FROM lvProducts "
     strSQL = strSQL & "WHERE (lvProducts.ParentID = " & CatID & ") "
     strSQL = strSQL & "ORDER BY lvProducts.[Product Name];"
    
    'Open filtered Products List for selected category
    Set db = CurrentDb
    Set rst = db.OpenRecordset(strSQL, dbOpenSnapshot)
    
    Do While Not rst.BOF And Not rst.EOF
        intcount = intcount + 1
        strProduct = rst![Product Name]
        strPKey = Prfx & CStr(rst!PID)
        
        'List Item Add() Syntax:
        'lvList.ListItems.Add Index,Key,Text,Icon,SmallIcon
        Set tmpLItem = lvList.ListItems.Add(, strPKey, strProduct, , 3) 'first column
            lvList.ForeColor = vbBlue
            
            'List second column sub-item Syntax:
            'tmpLItem.ListSubItems.Add Column - Index, Key, Text, ReportIcon, ToolTipText
            tmpLItem.ListSubItems.Add 1, strPKey & CStr(intcount), Nz(rst![Quantity Per Unit], ""), 6
            
            'List third column sub-item
            tmpLItem.ListSubItems.Add 2, strPKey & CStr(intcount + 1), Format(rst![list Price], "0.00"), 6, "In Local Currency."
        rst.MoveNext
    Loop
    
    Set db = Nothing
    Set rst = Nothing
    
    If intcount > 0 Then lvList.ListItems(1).Selected = True
    
End Sub

Private Sub TreeView0_NodeClick(ByVal Node As Object)
Dim Cat_ID As String
Cat_ID = Node.Tag

LoadListView Cat_ID

End Sub

Private Sub TreeView0_OLEStartDrag(Data As Object, AllowedEffects As Long)
    Set tv.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)
On Error GoTo TreeView0_OLEDragOver_Err

    Dim nodSelected As MSComctlLib.Node
    Dim nodOver As MSComctlLib.Node
    
    If tv.SelectedItem Is Nothing Then
        'Select a node if one is not selected
        Set nodSelected = tv.HitTest(X, Y)
        If Not nodSelected Is Nothing Then
            nodSelected.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
    
TreeView0_OLEDragOver_Exit:
Exit Sub

TreeView0_OLEDragOver_Err:
MsgBox Err & " : " & Err.Description, vbInformation, "TreeView0_OLEDragOver()"
Resume TreeView0_OLEDragOver_Exit
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 tv_nodSource As Node
    Dim tv_nodTarget As Node
    
    Dim strtv_ParentKey As String
    Dim strtv_TargetKey As String
    Dim strListItemKey As String
    Dim strSQL As String
    
    Dim vCatID As Long
    Dim lngPID As Long
    
    On Error GoTo TreeView0_OLEDragDrop_Err
    
    'Get the source/destination Nodes
    Set tv_nodSource = tv.SelectedItem
    Set tv_nodTarget = tv.HitTest(X, Y)
    
        If Not tv_nodTarget Is Nothing Then
            strtv_ParentKey = tv_nodSource.Key
            strtv_TargetKey = tv_nodTarget.Key
                
            If strtv_ParentKey = strtv_TargetKey Then Exit Sub

            'Extract ListItem Key
            strListItemKey = lvList.SelectedItem.Key
                
            'extract Category Record CID Value
            'and ListItem Product ID Key
            vCatID = Val(Mid(tv_nodTarget.Key, 2))
            lngPID = Val(Mid(strListItemKey, 2))
    
            'UPDATE lvProducts Table
            strSQL = "UPDATE lvProducts SET ParentID = " & vCatID & _
            " WHERE PID = " & lngPID
             
            CurrentDb.Execute strSQL, dbFailOnError
                
            Set tv.DropHighlight = Nothing
            tv_nodSource.Selected = True
                
            'Rebuild ListView Nodes
            TreeView0_NodeClick tv_nodSource
                
        Else ' Invalid Target location
            MsgBox "The destination is invalid!", vbInformation
        End If
    
TreeView0_OLEDragDrop_Exit:
Exit Sub

TreeView0_OLEDragDrop_Err:
MsgBox Err & " : " & Err.Description, vbInformation, "TreeView0_OLEDragDrop()"
Resume TreeView0_OLEDragDrop_Exit
End Sub

Private Sub TreeView0_OLECompleteDrag(Effect As Long)
    Set tv.DropHighlight = Nothing
End Sub

Private Sub cmdClose_Click()
    DoCmd.Close
End Sub

Segmen Kode VBA yang sudah dikenal.

Dalam Form_Load() Prosedur Acara, kami menginisialisasi Kontrol TreeVew, ListView, ImageList. Ini menciptakan ColumnHeadings dari Kontrol ListView, sebelum mengisi item Daftar di kontrol Listview. Di akhir rutinitas ini, kita memanggil subrutin LoadTreeView().

LoadTreeView() subrutin mengisi Node Kategori produk pada Kontrol TreeView, dengan catatan dari lvCategory Meja. Memuat Node pada Kontrol TreeView adalah proses dua langkah. Mengapa demikian, daripada melakukannya sekaligus? Aspek ini telah dijelaskan secara rinci di Halaman sebelumnya, tautan ke-7 pada daftar tautan berikan di atas jika Anda ingin melewatinya. Mengulangi semuanya di sini mungkin tidak tepat.

Di akhir subrutin di atas, LoadListView() subrutin telah dipanggil dengan Nilai CID catatan Kategori pertama 1 sebagai parameter.

Catatan Produk dengan nilai bidang ParentID 1 telah difilter dan terdaftar di ListView Control. Prosedur ini dijelaskan secara rinci dalam posting minggu lalu, item ke-8, di antara Daftar Tautan yang diberikan di atas.

Subrutin Tindakan Seret-Lepas.

Subrutin berikut yang terkait dengan tindakan Seret dan Lepas akan dijalankan secara otomatis dalam urutan yang disajikan di bawah ini:

  1. TreeView0_OLEStartDrag()
  2. TreeView0_OLEDragOver()
  3. TreeView0_OLEDragDrop()
  4. TreeView0_OLECompleteDrag()

Subrutin pertama dan terakhir menginisialisasi Node yang terlibat dan mengatur ulang statusnya masing-masing di akhir.

Yang kedua, subrutin OLEDragOver() bekerja seperti Prosedur Event MouseMove dan melacak pergerakan mouse selama operasi drag-drop. Ini menyoroti NodeText saat mouse berada di atas Node dan melacak lintasannya hingga tombol kiri mouse dilepaskan.

Kode prosedur TreeView0_OLEDragDrop() saja tercantum di bawah ini.

Private Sub TreeView0_OLEDragDrop(Data As Object, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)

    Dim tv_nodSource As Node
    Dim tv_nodTarget As Node
    
    Dim strtv_ParentKey As String
    Dim strtv_TargetKey As String
    Dim strListItemKey As String
    Dim strSQL As String
    
    Dim vCatID As Long
    Dim lngPID As Long
    
    On Error GoTo TreeView0_OLEDragDrop_Err
    
    'Get the source/destination Nodes
    Set tv_nodSource = tv.SelectedItem
    Set tv_nodTarget = tv.HitTest(X, Y)
    
        If Not tv_nodTarget Is Nothing Then
            strtv_ParentKey = tv_nodSource.Key
            strtv_TargetKey = tv_nodTarget.Key
                
            If strtv_ParentKey = strtv_TargetKey Then Exit Sub

            'Extract ListItem Key
            strListItemKey = lvList.SelectedItem.Key
                
            'extract Category Record CID Value
            'and ListItem Product ID Key
            vCatID = Val(Mid(tv_nodTarget.Key, 2))
            lngPID = Val(Mid(strListItemKey, 2))
    
            'UPDATE lvProducts Table
            strSQL = "UPDATE lvProducts SET ParentID = " & vCatID & _
            " WHERE PID = " & lngPID
             
            CurrentDb.Execute strSQL, dbFailOnError
                
            Set tv.DropHighlight = Nothing
            tv_nodSource.Selected = True
                
            'Rebuild ListView Nodes
            TreeView0_NodeClick tv_nodSource
                
        Else ' Invalid Target location
            MsgBox "The destination is invalid!", vbInformation
        End If
    
TreeView0_OLEDragDrop_Exit:
Exit Sub

TreeView0_OLEDragDrop_Err:
MsgBox Err & " : " & Err.Description, vbInformation, "TreeView0_OLEDragDrop()"
Resume TreeView0_OLEDragDrop_Exit
End Sub

Aksi Seret Jatuhkan Langkah demi Langkah.

Prosedur TreeView0_OLEDragDrop() dijalankan segera setelah tombol kiri mouse dilepaskan untuk menyelesaikan Drop Action. Di awal kode, referensi aktif dan Target TreeView Node telah disimpan di tv_nodSource dan tv_nodTarget Variabel objek masing-masing.

Selanjutnya kita melakukan pengecekan, apakah ListItem sudah di-drop pada Node TreeView yang valid atau belum. Jika dijatuhkan pada Node Kategori sumber yang sama atau pada area kosong pada Kontrol TreeView maka gerakan ini tidak valid. Jika telah dijatuhkan di area kosong Kontrol TreeView maka tv_nodTarget variabel objek akan berisi nilai Tidak ada. Dalam hal ini, menampilkan pesan dan keluar dari Program.

Selanjutnya, Nilai TreeView Source dan Target Node Key disimpan dalam dua Variabel String. Jika kedua kunci sama maka ListItem akan diseret dan dijatuhkan pada Parent Node (Category Node) pada TreeView Control. Eksekusi program dibatalkan dari melanjutkan lebih lanjut.

Jika kedua Kunci berbeda maka sekarang saatnya untuk memperbarui perubahan pada ParentID Catatan Produk bidang, dengan CID Catatan Kategori Target Kode, dan segarkan Item ListView.

Nilai Kunci ListItem yang dipilih (PID nilai bidang) telah disimpan di strListItemKey Variabel String.

CID yang sebenarnya dari catatan Kategori nilai bidang telah diekstraksi dari Node Target, dengan menghapus nilai karakter awalan X dan disimpan dalam variabel vCatID . Ini adalah Nilai yang akan kami perbarui di bidang ParentID Catatan Produk, untuk menempatkan ListItem di bawah Kategori baru.

Demikian pula, nilai PID Kunci Produk Item Daftar yang dipilih diekstraksi dan disimpan dalam Variabel lngPID . Ini telah digunakan sebagai kriteria untuk memfilter dan memilih data Produk tertentu untuk memperbarui bidang ParentID dengan vCatID .

Sebuah PEMBARUAN Query SQL telah dibuat untuk memfilter record, menggunakan lngPID Kode sebagai Kriteria, untuk memfilter catatan Produk, dan untuk memperbarui vCatID Nilai dalam P bukanID lapangan.

Jalankan metode Currentdb telah dipanggil dengan SQL dan memperbarui perubahannya.

Sorotan Node telah diatur ulang ke Node Sumber.

Selanjutnya, subrutin TreeView0_NodeClick() telah dipanggil dengan tv_nodSource sebagai parameter untuk mencerminkan perubahan pada Kontrol ListView.

Tutup Klik Tombol akan menutup Formulir.

Unduh Basis Data Demo.

Anda dapat mengunduh database Demo, melakukan uji coba, dan mempelajari Kode VBA.


SELAMAT TAHUN BARU SANGAT SELAMAT UNTUK ANDA.

Penanganan ACARA MS-ACCESS

  1. Modul Kelas MS-Access Tanpa Acara
  2. Dengan Acara dan Menentukan Acara Anda Sendiri
  3. Tab Kotak Teks Daftar Kombo Tanpa Acara
  4. Access Form Control Arrays Dan Event
  5. Access Form Control Arrays Dan Event-2
  6. Access Form Control Arrays Dan Event-3
  7. Peristiwa di Modul Kelas untuk Sub-Formulir
  8. Peristiwa di Modul dan Data Kelas
  9. Tanpa Acara dan Akses Laporan Peristiwa
  10. Peristiwa dan Penyembunyian Baris Laporan
  11. Tanpa Acara dan Sorotan Baris Laporan
  12. Tanpa Kotak Teks dan Tombol Perintah
  13. Tombol Perintah Kotak Teks Tanpa Acara
  14. Tanpa Peristiwa dan Semua Jenis Kontrol Formulir



  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 OASIS-SVN dan git untuk kontrol kode sumber Access

  2. Tanda bahwa Database Anda Tidak Lagi Berfungsi untuk Anda

  3. Saatnya Kami Memberi Microsoft Access IDE Beberapa Cinta

  4. Empat Cara Menggunakan Microsoft Access

  5. Kelas Dasar MS-Access dan Objek Turunannya