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

ListView Control Drag-Drop Sort Events

Mengatur Ulang Baris Data di Kontrol ListView.

Dalam episode sebelumnya dari Tutorial ini, kita telah mempelajari cara mengatur ulang Kolom dengan mengaktifkan fitur ini:AllowColumnReorder pilihan pada Lembar Properti. Tapi, relokasi baris dilakukan dengan menyeret dan menempatkannya di baris lain. Untuk mengatur ulang baris kontrol ListView, tindakan Seret dan Lepas ListItem memerlukan pengaktifan fitur ini di Lembar Properti. Tapi ini saja tidak akan berhasil, perlu Kode VBA untuk mengatur ulang item ke urutan yang diperlukan.

Mari kita buat contoh Formulir Akses dengan kontrol dan Kode VBA di database kita untuk latihan ini. Contoh gambar Form dengan ListBox dan ListView Controls diberikan di bawah ini.

Kami telah membuat daftar Tabel dan Kueri (bukan Kueri Tindakan) di Kotak Daftar. Memilih salah satu item daftar akan menampilkan rekaman secara instan di kontrol ListView, seperti yang kita lihat di tampilan Lembar Data.

Tugas Desain.

  1. Buat Tabel baru dengan satu bidang Teks, dengan nama bidang DataList .

  2. Simpan Tabel dengan nama lvTables (lv adalah singkatan dari ListView).

  3. Buka Tabel dalam Tampilan Lembar Data.

  4. Tambahkan beberapa nama tabel dan Pilih nama kueri dari database Anda ke dalam Tabel. Saya telah mengimpor Tabel dari database sampel Northwind untuk daftar saya.

    Catatan: Lampiran Bidang tidak valid di Kontrol ListView. Buat Kueri Pilih untuk tabel dengan bidang lampiran dan pilih semua bidang kecuali bidang Lampiran.

  5. Buat dan buka Formulir baru di Design View.

  6. Masukkan Kontrol ListBox pada formulir, tampilkan Lembar Properti dan ubah Nama nilai properti menjadi List0 .

  7. Ubah label turunannya Keterangan nilai ke Tabel .

  8. Tampilkan lembar properti kontrol ListBox dan atur Sumber Baris nilai properti ke lvTables nama.

  9. Periksa apakah Jenis Sumber Baris ditetapkan sebagai Tabel/Kueri dan nilai properti Kolom Terikat adalah 1. Jika berbeda maka ubah.

  10. Masukkan Kontrol ListView dari Daftar Kontrol ActiveX dan ubah Nilai Properti Nama menjadi ListView1 .

  11. Ubah ukuran kedua kontrol seperti yang ditunjukkan pada gambar Formulir demo yang diberikan di atas.

  12. Sisipkan Label di atas Kontrol dan ubah Name dan Caption Property Values ​​menjadi Heading. Nilai Caption akan diubah dari kode vba ketika Tabel atau Query dipilih dari ListBox.

  13. Buat Tombol Perintah di bawah Kontrol dan ubah nilai properti Name menjadi cmdClose dan nilai properti Caption menjadi Tutup .

  14. Klik kanan pada ListView Control, sorot ListViewCtrl Object pilihan, dan pilih Properti .

  15. Ubah pengaturan properti agar sesuai dengan pengaturan di Umum Gambar tab diberikan di bawah ini.

  16. Gambar ListView Control Property Sheet - Tampilan tab umum diberikan di bawah ini:

    Beberapa opsi ini telah kami atur di sesi sebelumnya. Di sini kita memerlukan opsi berikut untuk tindakan Drag Drop kita:

    • OLEDragOtomatis - 1

    • OLEDropManual - 1

    • FullRowSelect - Benar

    • Pelacakan Panas - Benar

Pastikan pengaturan di atas sesuai dengan lembar properti Anda, lalu simpan Formulir.

Tampilkan Modul VBA dari Formulir.

Formulir Modul VBA Code.

Salin dan Tempel Kode VBA berikut ke dalam Modul, timpa Baris Kode yang ada, jika ada:

Option Compare Database
Option Explicit

Dim lvwList As MSComctlLib.ListView
Dim strTable As String
Dim db As DAO.Database
Dim rst As DAO.Recordset

Private Sub Form_Load()
    Set lvwList = Me.ListView1.Object

End Sub


Private Sub Form_Unload(Cancel As Integer)
On Error GoTo Form_Unload_Err
Dim lvItem As ListItem
Dim tmp As Long
Dim criteria As String
Dim strfield As String
Dim flag As Boolean
Dim fld As String

If strTable = "" Then
Set lvwList = Nothing
    Exit Sub
End If

Set db = CurrentDb
Set rst = db.OpenRecordset(strTable, dbOpenDynaset)
flag = False
For Each lvItem In lvwList.ListItems
    tmp = lvItem.Index
    strfield = lvwList.ColumnHeaders(1).Text
    criteria = strfield & " = " & Chr(34) & lvItem.Text & Chr(34)
    
    rst.FindFirst criteria
  
    If Not rst.NoMatch Then
       If (rst.Fields(strfield).Value = lvItem.Text) _
       And (rst.Fields(1).Value = tmp) Then
         'GoTo nextitem
       Else
            rst.Edit
            rst.Fields(1).Value = tmp
            rst.Update
       End If
    Else
        MsgBox "Item: " & tmp & " Not Found!"
    End If
Next
rst.Close

Set lvwList = Nothing
Set lvItem = Nothing
Set rst = Nothing
Set db = Nothing

Form_Unload_Exit:
Exit Sub

Form_Unload_Err:
MsgBox Err & " : " & Err.Description, , "Form_Unload()"
Resume Form_Unload_Exit

End Sub

Private Sub ListView1_ColumnClick(ByVal ColumnHeader As Object)
' When a ColumnHeader object is clicked, the ListView control
' sorts the data of that column. On the first Click on the Column
'will sort in Ascending Order, second Click will sort in Descending
With Me.ListView1
    ' Set the SortKey to the Index of the ColumnHeader - 1
    .SortKey = ColumnHeader.Index - 1
    
' Set Sorted to True to sort the list.
 If .SortOrder = lvwAscending Then
    .SortOrder = lvwDescending
 Else
    .SortOrder = lvwAscending
 End If
 
    .Sorted = True
End With

End Sub

Private Sub List0_Click()

strTable = List0.Value

Call LoadListView(strTable)

End Sub

Private Sub LoadListView(ByVal s_Datasource As String)
On Error GoTo LoadListView_Err
    Dim j As Integer
    Dim tmpLItem As MSComctlLib.ListItem
    Dim strHeading As String
    
    strHeading = UCase(s_Datasource)
    With Me.Heading
        .caption = strHeading
        .FontName = "Courier New"
        .FontSize = 20
        .FontItalic = True
        .FontBold = True
    End With
    
   'Initialize ListView Control
    lvwList.ColumnHeaders.Clear
    lvwList.ListItems.Clear
    
    Set db = CurrentDb
    Set rst = db.OpenRecordset(s_Datasource, dbOpenSnapshot)
       
    'Initialize ListView & Column Headers Property Values
     With lvwList
        .Font.Size = 10
        .Font.Name = "Verdana"
        .Font.Bold = False
        .GridLines = True
    End With
    
    With lvwList
        'Syntax: .ColumnHeaders.Add Index, Key, Text, Width in Pixels, Alignment, Icon
       For j = 0 To rst.Fields.Count - 1
        .ColumnHeaders.Add , , rst.Fields(j).Name, IIf(j = 0, 3000, 1400), 0
       Next
    End With
   Dim I As Long
    rst.MoveFirst
    Do While Not rst.BOF And Not rst.EOF
    'Syntax: lvwList.ListItems.Add Index, Key, Text, Icon, SmallIcon
        Set tmpLItem = lvwList.ListItems.Add(, , rst.Fields(0).Value) 'Name column
        
         'Syntax: tmpLItem.ListSubItems.Add Index, Key, Text, ReportIcon, ToolTipText
          With tmpLItem
                For j = 1 To rst.Fields.Count - 1
                    .ListSubItems.Add , , Nz(rst.Fields(j).Value, "")
                Next
          End With
        rst.MoveNext
    Loop
    rst.Close
    
    With lvwList
        If .ListItems.Count > 0 Then
            .ListItems(1).Selected = True
        End If
    End With
  
    Set db = Nothing
    Set rst = Nothing
    
LoadListView_Exit:
Exit Sub

LoadListView_Err:
MsgBox Err & " : " & Err.Description, , "LoadListView()"
Resume LoadListView_Exit
End Sub


Private Sub ListView1_OLEDragOver(data As Object, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single, State As Integer)
    'Highlight the item when draged over it
    Set ListView1.DropHighlight = ListView1.HitTest(x, y)

End Sub

Private Sub ListView1_OLEDragDrop(data As Object, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)

'Item being dropped
Dim lvwDrag As ListItem
'Item being dropped on
Dim lvwDrop As ListItem
'Item being readded to the list
Dim lvwTarget As ListItem
'Subitem reference in dropped item
Dim lvwSub As ListSubItem
'Drop position
Dim intTgtIndex As Integer
Dim j As Integer

Set lvwDrop = lvwList.HitTest(x, y)
Set lvwDrag = lvwList.SelectedItem 'save a copy of draged item

'Ignore overlapping drag or drop Item actions
If (lvwDrop Is Nothing) Or (lvwDrag Is Nothing) Or (lvwDrop = lvwDrag) Then
    Set lvwList.DropHighlight = Nothing
    Set lvwDrop = Nothing
    Set lvwDrag = Nothing
    Exit Sub
End If

'Save the droped position Index Number
intTgtIndex = lvwDrop.Index
'Remove Dragged Item from its old position
lvwList.ListItems.Remove lvwDrag.Index

'For j = intTgtIndex To ListItems.Count
    
'Creates a new Item in the Target Item position
'with the Dropped Item Index Number and Dragged Item.Text.
'Saves the new Item reference in lvwTarget Item.

'* The original Droped-on Target) Item will be moved down
'* by incrementing its original Index Number
Set lvwTarget = lvwList.ListItems.Add(intTgtIndex, , lvwDrag.Text)

'Copy the original Draged Item's subitems to the new item
If lvwDrag.ListSubItems.Count > 0 Then
    For Each lvwSub In lvwDrag.ListSubItems
        lvwTarget.ListSubItems.Add , lvwSub.Key, lvwSub.Text
    Next
End If

'Highlight the draged item in its new position
lvwTarget.Selected = True

'Destroy all objects
Set lvwTarget = Nothing
Set lvwDrag = Nothing
Set lvwDrop = Nothing
Set lvwList.DropHighlight = Nothing

End Sub

Private Sub cmdClose_Click()
    DoCmd.Close acForm, Me.Name
End Sub

Anda sudah familiar dengan Kode VBA di atas kecuali subrutin yang baru ditambahkan:ListView1_OLEDragOver(), ListView1_OLEDragDrop(), Form_Unload(), dan ListView1_ColumnClik() Prosedur. Dua prosedur pertama akan membantu kita menyeret Item (baris) dan meletakkannya di atas Item lain untuk memasukkannya ke lokasi baru. Prosedur Form_Unload() dan ListView1_ColumnClick() akan mengurutkan Item.

Gambar berikut menunjukkan aksi Drag and Drop dalam urutan eksekusinya

Gambar pertama di bawah ini menunjukkan urutan tindakan seret dan lepas. ListItem, dengan EmployeeID 7, diseret oleh pengguna dan dijatuhkan di atas ListItem dengan ID 3.

Gambar kedua menunjukkan pergerakan ListItem dalam urutan terbalik.

Saat penunjuk tetikus bergerak di atas baris dengan item yang diseret, antara baris sumber dan target, akan menyorot satu demi satu saat naik.

Aksi Seret dan Lepas dalam Gambar.

Baris dengan ID Karyawan 7 dijatuhkan pada Item dengan ID Karyawan 3 di atas.

Analisis Segmen Kode VBA.

Pilihan item dari ListBox, prosedur event List0_Click() berjalan dan memuat catatan ke dalam Kontrol ListView.

Private Sub List0_Click()
Dim strTable As String

strTable = List0.Value

  Call LoadListView(strTable)

End Sub

Nama Tabel/Kueri yang dipilih disimpan di strTable variabel string. LoadListView() subrutin berjalan dengan variabel strTable sebagai parameter. Kami telah membaca Kode ini lebih dari sekali di sesi sebelumnya, dan Anda dapat mengunjungi Halaman tersebut menggunakan Tautan yang disediakan di bagian bawah halaman ini untuk detailnya. Anda mungkin menemukan beberapa perubahan kecil yang saya buat dalam Kode ini.

Kami belum menggunakan Kontrol ImageList dalam episode ini Ikon, SmallIcon Nilai parameter dalam Metode ListItems.Add() dan ReportIcon, TooltipText nilai parameter dalam metode ListSubItems.Add() juga tidak digunakan.

Mari kita lihat apa yang terjadi di ListView1_OLEDragOver() dan ListView1_OLEDragDrop() Segmen Kode VBA.

Prosedur ListView1_OLEDragOver().

Private Sub ListView1_OLEDragOver(Data As Object, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single, State As Integer)
    'Highlight the item when draged over it
    Set ListView1.DropHighlight = ListView1.HitTest(x, y)
End Sub 

Prosedur ini secara otomatis dijalankan ketika Anda mencoba untuk mengklik dan menahan pada baris, mulai menyeret dan memindahkan baris lain dalam perjalanan menuju baris target. Tindakan seret bergerak di atas baris lain yang akan disorot.

ListView1.HitTest(x, y) fungsi membaca koordinat x, y yang menentukan posisi baris pada Kontrol ListView dan menyorot baris tersebut. Proses ini berlanjut ketika Anda melewati baris lain sampai Anda menjatuhkannya di baris target dengan melepaskan tombol mouse. Tindakan jatuhkan memicu ListView1_OLEDragDrop() prosedur dan mengeksekusi perubahan baris sumber atas prosedur.

Prosedur ListView1_OLEDragDrop.

Private Sub ListView1_OLEDragDrop(Data As Object, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)

'Item being dragged
Dim lvwDrag As ListItem
'Item being dropped on
Dim lvwDrop As ListItem
'Item being added to the list
Dim lvwTarget As ListItem
'Subitem reference used in For . . .Next loop
Dim lvwSub As ListSubItem 'Drop position index Dim intTgtIndex As Integer Set lvwDrop = lvwList.HitTest(x, y) 'save the source item Set lvwDrag = lvwList.SelectedItem 'save a copy of draged item 'Ignore overlapping drag or drop Item actions If (lvwDrop Is Nothing) Or (lvwDrag Is Nothing) Or (lvwDrop = lvwDrag) Then Set lvwList.DropHighlight = Nothing Set lvwDrop = Nothing Set lvwDrag = Nothing Exit Sub End If 'Save the droped position Index Number intTgtIndex = lvwDrop.Index 'Remove Dragged Item from its old position lvwList.ListItems.Remove lvwDrag.Index 'Creates a new Item in the Target Item position 'with the Dropped Item Index Number and Dragged Item.Text. 'Saves the new Item reference in lvwTarget Item. '* The original Droped-on Target) Item will be moved down '* by incrementing its original Index Number Set lvwTarget = lvwList.ListItems.Add(intTgtIndex, , lvwDrag.Text) 'Copy the original Draged Item's subitems to the new item If lvwDrag.ListSubItems.Count > 0 Then For Each lvwSub In lvwDrag.ListSubItems lvwTarget.ListSubItems.Add , lvwSub.Key, lvwSub.Text Next End If 'Highlight the draged item in its new position lvwTarget.Selected = True 'Destroy all objects Set lvwTarget = Nothing Set lvwDrag = Nothing Set lvwDrop = Nothing Set lvwList.DropHighlight = Nothing End Sub

Mari kita tinjau prosedur ini bagian demi bagian dan pahami apa yang terjadi di sana. Segmen Kode berikut mendeklarasikan Variabel Objek yang diperlukan untuk menangani tindakan Seret dan Lepas:

'Item being dragged
Dim lvwDrag As ListItem
'Item being dropped on
Dim lvwDrop As ListItem
'Reference of the Item being added to the list
Dim lvwTarget As ListItem
'Subitem reference used in For . . .Next loop
Dim lvwSub As ListSubItem
'Drop position index
Dim intTgtIndex As Integer

Set lvwDrop = lvwList.HitTest(x, y)
Set lvwDrag = lvwList.SelectedItem 'save a copy of draged item

Tiga Obyek sementara ListItem pertama dideklarasikan dengan nama yang berbeda.

lvwDrag Objek ListItem akan menyimpan salinan baris yang kita pilih untuk diseret ke lokasi baru.

lvwDrop ListItem Object akan menyimpan referensi dari baris tempat kita meletakkan item daftar yang diseret.

Selama tindakan perubahan ListItems, kami akan menghapus item Sumber dari lokasi aslinya, kemudian membuatnya di lokasi target, dengan nomor Indeks ListItem sumber. Referensi ListItem baru ini disimpan di lvwTarget Variabel objek ListItem.

lvwSub Variabel dideklarasikan sebagai Variabel Objek sequencing di For . . .Berikutnya Lingkaran. Pengulangan ini memerlukan urutan melalui ListSubItems, (Kolom ke-2 dan seterusnya) satu per satu, dari objek lvwDrag. Meskipun kami telah menghapus ListItem asli, kami telah menyimpan salinannya di objek lvwDrag ListItem.

Nomor Indeks lvwDrop ListItem disimpan di intTgtIndex Variabel.

lvwList.HitTest(x, y) Fungsi membaca koordinat x, y dari ListView Control dan mengidentifikasi ListItem target di mana kita telah menjatuhkan ListItem sumber dan membuat salinannya di lvwDrop Object.

Kami akan memilih ListItem terlebih dahulu sebelum kami menyeretnya ke posisi baru.

lvwList.SelectedItem Properti akan ditetapkan sebagai True. Dengan bantuan status properti ini, kami membuat salinan ListItem yang dipilih ke dalam lvwDrag Objek ListItem. Segmen Kode berikutnya memvalidasi Objek ListItem Sumber dan Target.

Pemeriksaan Validasi pada Tindakan Drag-Drop.

'Ignore overlapping drag or drop Item actions, 
'OR drag and drop happens on the same ListItem.
If (lvwDrop Is Nothing) Or (lvwDrag Is Nothing)  Or (lvwDrop = lvwDrag) Then
    Set lvwList.DropHighlight = Nothing
    Set lvwDrop = Nothing
    Set lvwDrag = Nothing
    Exit Sub
End If

Segmen kode di atas memvalidasi tindakan seret dan lepas. Jika tindakan ini tidak dimulai atau diakhiri pada item yang valid maka Objek lvwDrop atau lvwDrag atau keduanya akan kosong. Atau gerakan tidak valid lainnya dapat terjadi saat pengguna memindahkan baris ke atas atau ke bawah tetapi mungkin berubah pikiran dan menjatuhkannya kembali pada baris yang sama. Deteksi gerakan yang salah semacam ini akan menghentikan program.

Jika pengujian di atas terbukti valid maka program akan melanjutkan eksekusi prosedur berikutnya untuk mengatur ulang Baris.

'Save the dropped position ListItem Index Number
intTgtIndex = lvwDrop.Index

'Remove Dragged Item from its old position
lvwList.ListItems.Remove lvwDrag.Index

'Creates a new Item in the Target Item position
'with the Dropped Item Index Number and Dragged Item.Text.
'Saves the new Item reference in lvwTarget Item.

'* The original Droped-on Target) Item will be moved down
'* by incrementing its original Index Number
Set lvwTarget = lvwList.ListItems.Add(intTgtIndex, , lvwDrag.Text)

'Copy the original Draged Item's subitems to the new item
If lvwDrag.ListSubItems.Count > 0 Then
    For Each lvwSub In lvwDrag.ListSubItems
        lvwTarget.ListSubItems.Add , lvwSub.Key, lvwSub.Text
    Next
End If

'Highlight the draged item in its new position
lvwTarget.Selected = True

Sembilan baris di atas dari Kode yang dapat dieksekusi (baris lain adalah komentar) tindakan agak mudah.

intTgtIndex =lvwDrop.Index pernyataan menyimpan nomor Indeks ListItem target di intTgtIndex Variabel.

Karena kita telah menyimpan ListItem Baris Sumber di Object lvwDrag sementara, langkah selanjutnya adalah menghapus ListItem sumber dari Kontrol ListView. Prosedur ListItems.Remove() dipanggil, dengan pernyataan lvwList.ListItems.Remove lvwDrag.Index .

Singkatnya, tindakan Drag Drop adalah menghapus ListItem dari lokasi aslinya dan membuatnya lagi di lokasi target dengan nomor indeks baris target.

Pernyataan Set lvwTarget =lvwList.ListItems.Add(intTgtIndex, , lvwDrag.Text) membuat ListItem baru dengan nomor indeks lokasi targetnya intTgtIndex dan Teks nilai Source ListItem yang disimpan di Object lvwDrag tadi.

Saat membuat ListItem untuk pertama kalinya, kami hanya menggunakan dua nilai ini, indeks, dan Teks nilai parameter. Kami belum menggunakan opsi parameter lain Kunci, Ikon, dan SmallIcon jika tidak, kita harus menyertakan nilai parameter tersebut juga dari objek lvwDrag.

Sesuai dengan contoh Gambar Drag Drop kami yang ditunjukkan di atas, kami telah memindahkan ListItem ke-7 dan menjatuhkannya pada ListItem ke-3. Setelah itu, kami telah menghapus Item ke-7 (atau sumber ListItem) dari Kontrol ListView. Membuat ListItem baru dengan nomor indeks target 3.

Sekarang, ada dua item dengan nomor indeks yang sama 3, yang sudah ada dengan nomor indeks 3 dan yang baru kita buat dengan nomor indeks 3. Semua informasi lainnya diambil dari Obyek lvwDrag (atau ListItem ke-7 yang disimpan di lvwDrag Objek sebelumnya).

Sistem secara otomatis menambah ListItem 3 yang ada dan seterusnya ke nomor urut berikutnya 3,4,5 . . . menjadi 4,5,6 . . . dan memindahkannya ke depan untuk memberi ruang bagi item yang masuk untuk disisipkan di antaranya.

Dampak Menghapus Baris dan Membuatnya di tempat lain.

Asumsikan bahwa kita melakukan gerakan itu dalam urutan terbalik, seperti menyeret ListItem nomor 3 dari atas dan menjatuhkannya pada item nomor 7 lalu apa yang terjadi?

Secara alami, kami akan menghapus Item ke-3 dan akan mencoba membuat item baru dengan nomor indeks 7 di lokasi baru. Ketika Item nomor 3 dihapus item nomor 4 dan seterusnya akan bergeser ke atas atau 4,5,6,7,8,9 akan menjadi 3,4,5,6,7,8 (untuk membuat semua item berurutan) atau lebih awal item dengan nomor indeks 7 akan menjadi 6.

Saat kita membuat Item baru dengan nomor indeks 7, 7,8 yang ada akan menjadi 8,9 lagi. Saat kita melihat pergerakan baris saat penghapusan baris dan waktu pembuatan, contoh pertama akan memindahkan baris target ke bawah untuk memberi jalan bagi item yang masuk. Pada contoh kedua dijelaskan (bergerak 3 ke 7) baris tujuan akan bergerak ke atas.

Catatan: Tonton tNilai ID Karyawan untuk penempatannya sebagai petunjuk untuk ListItem bergeser ke bawah atau ke atas saat kita mengatur ulang ListItem.

Saya telah menyebutkan ListItem di mana-mana dalam operasi drag-drop. ListItem merujuk ke Kolom pertama dari Baris ListView saja. Nilai kolom lainnya adalah ListSubItems atau item turunan dari ListItem. Itu berarti Anda hanya dapat Drag and Drop Kolom pertama saja. Kolom atau ListSubItems lainnya akan dipindahkan di bawah ListItem dengan Kode VBA.

Ini benar jika Anda belum mengaktifkan FullRowSelection pada Lembar Properti Kontrol ListView pada Umum Tab.

Jika diaktifkan, Anda dapat memilih kolom apa pun, tetapi Sistem merujuk ke Indeks ListItem untuk tujuan pemesanan ulang Baris. Bandingkan dua gambar di atas dengan kumpulan dua contoh gambar lainnya, gambar ketiga dan keempat dari bagian atas halaman ini.

Tindakan Seret dan Lepas tidak akan berfungsi jika dua nilai properti berikut tidak disetel pada Lembar Properti Kontrol ListView di Umum Tab.:

  • ccOLEDragAutomatic =1
  • ccOLEDropManual =1

Lima pernyataan berikutnya akan memindahkan ListSubItems, jika ada, ke ListItem yang baru dibuat di lokasi baru.

Selanjutnya, ListItem yang baru dibuat akan disorot.

Selanjutnya, semua objek sementara yang dibuat akan dihapus dari memori.

Catatan: Hal penting lainnya yang perlu diperhatikan di sini adalah bahwa pengaturan ini bersifat sementara dan hilang ketika Anda menutup Formulir atau memuat Tabel/Kueri lain pada Kontrol ListView.

Jika kita ingin agar urutan ListItems yang diubah tetap permanen, atau sampai urutan berikutnya diubah, maka kita harus dapat memperbarui nomor urut terindeks saat ini pada tabel itu sendiri. Kami telah menambahkan bidang Integer baru dengan ID nama bidang pada Tabel Karyawan.

Layar sampel dengan data Karyawan yang disusun ulang dalam urutan Abjad diberikan di bawah ini:

Karena bidang ID Karyawan adalah bidang AutoNumber dan ditautkan dengan tabel terkait lainnya, kami telah menambahkan Bidang Nomor baru dengan ID nama bidang. Nilai bidang ini awalnya disetel dengan nomor urut yang sama dari ID Karyawan secara manual. Nilai bidang ini akan awalnya dalam urutan ini. Namun, data Baris ListView dapat berubah urutannya saat Anda mengatur ulang data pada Kontrol ListView karena tindakan Seret dan Lepas.

Lihat KaryawanQ Query SQL diberikan di bawah ini:

SELECT [FirstName] & " " & [LastName] AS EmployeeName, 
Employees.ID, 
Employees.EmployeeID, 
Employees.TitleOfCourtesy, 
Employees.Title, 
Employees.Address, 
Employees.City, 
Employees.Region, 
Employees.PostalCode, 
Employees.Country, 
Employees.HomePhone, 
Employees.Extension, 
Employees.Notes
FROM Employees
ORDER BY Employees.ID;

Kueri di atas digunakan sebagai Sumber Data untuk Kontrol ListView dan diurutkan pada Bidang ID. Bidang ID diperbarui dengan urutan Nomor Indeks yang diubah pada Kontrol ListView. Proses pembaruan berjalan dari Form_Unload() Prosedur Acara saat Anda menutup Formulir. Metode ini memastikan bahwa ketika Anda membuka Kontrol ListView di lain waktu, data akan berada dalam urutan yang Anda susun ulang terakhir kali.

Form_Unload() Kode VBA Prosedur Acara.

Private Sub Form_Unload(Cancel As Integer)
Dim lvItem As ListItem
Dim tmp As Long
Dim criteria As String
Dim strfield As String
Dim fld As String

If strTable = "" Then
Set lvwList = Nothing
    Exit Sub
End If

Set db = CurrentDb
Set rst = db.OpenRecordset(strTable, dbOpenDynaset)

For Each lvItem In lvwList.ListItems
    tmp = lvItem.Index
    strfield = lvwList.ColumnHeaders(1).Text 'EmployeeName
    criteria = strfield & " = " & Chr(34) & lvItem.Text & Chr(34)
    
    rst.FindFirst criteria
  
    If Not rst.NoMatch Then
       If (rst.Fields(strfield).Value = lvItem.Text) And (rst.Fields(1).Value = tmp) Then
         'GoTo nextitem
       Else
            rst.Edit
            rst.Fields(1).Value = tmp 'replace ID number
            rst.Update
       End If
    Else
        MsgBox "Item: " & tmp & " Not Found!"
    End If
Next
rst.Close

Set lvwList = Nothing
Set lvItem = Nothing
Set rst = Nothing
Set db = Nothing

End Sub

Periksa NamaKaryawan Nilai Bidang pada gambar di atas. Mereka diatur dalam urutan abjad. Nilai bidang ID baru pada Tabel Karyawan akan diperbarui dengan urutan nomor indeks ListView Control ListItem saat ini.

Jika Anda memperhatikan poin-poin berikut, Anda dapat dengan mudah memahami apa yang kami lakukan dengan kode di atas:

  1. Teks (kolom pertama) ListItem nilai parameter adalah nama karyawan dan disusun dalam Urutan Abjad.

  2. ListItems pada Kontrol ListView memiliki nomor indeks dari 1 hingga 9 dalam urutan yang ditampilkan di layar, yaitu nomor indeks item pertama adalah 1 dan yang terakhir adalah 9. Data asli pada nilai kolom ID Tabel Karyawan tidak dalam urutan ini.

  3. Kami mengambil Teks Nilai (Nama Karyawan) dari ListItem pertama dan cari nama di tabel.

  4. Ketika catatan ditemukan, nomor Indeks ListItem saat ini diperbarui (diganti) pada bidang ID di atas meja.

  5. Proses ini diulang untuk semua catatan yang tersisa di atas meja.

Mari kita pergi melalui Kode VBA. Pada awalnya, kami memeriksa apakah Tabel/Kueri data Sumber dimuat ke Kontrol ListView atau tidak?

Jika strTable Variabel tidak diinisialisasi dengan nama Query maka ListView Control kosong. Jika hal ini terjadi maka pengguna membuka Formulir dan menutupnya tanpa memilih nama Kueri untuk memuat data ke dalam kontrol ListView. Form_Unload Prosedur Acara dibatalkan pada saat ini dan menutup formulir.

Jika kontrol ListView memiliki data maka langkah selanjutnya dijalankan dan membuka kueri data Sumber KaryawanQ untuk diperbarui.

Langkah selanjutnya adalah menelusuri setiap ListItem dan memperbarui nomor indeks di bidang ID catatan Karyawan.

Pertama, nomor indeks baris saat ini disimpan di tmp Variabel.

Nama lvwList.ColumnHeader pertama EmployeeName dan nama karyawan tersebut diambil dari ListItem.Text menjadi ekspresi dalam Kriteria variabel string, seperti EmployeeName ="Andrew Fuller".

Kriteria Pertama.Temukan Pertama perintah mencari tabel data Sumber untuk menemukan catatan dengan nama yang diberikan. Saat catatan ditemukan, nomor Indeks ListItem saat ini diperbarui di Bidang ID.

Proses ini diulang untuk semua baris pada Kontrol ListView dan ketika selesai Formulir ditutup.

Lain kali Anda memuat catatan dari Kueri ini ke dalam Kontrol ListView, catatan tersebut akan ditampilkan dalam urutan yang sama saat Anda menutup formulir terakhir kali.

Catatan:Kueri menjadi penting di sini untuk mengurutkan data pada bidang ID dan menampilkannya dalam urutan yang diubah pada Kontrol ListView.

Semua pekerjaan ini adalah untuk menyimpan data dalam urutan terakhir yang diurutkan sehingga lain kali Anda membuka Formulir, data pada Kontrol ListView akan berada dalam urutan itu.

Metode Penyortiran Seperti Windows Explorer.

Di Windows Explorer, Anda dapat mengurutkan daftar yang ditampilkan dalam Ascending atau Descending Order dengan mengklik Judul Kolom mana pun. Kolom Header akan bekerja seperti Tombol Toggle. Klik berulang pada Column Header akan Mengurutkan data kolom dalam Ascending/Descending Order dengan ListView1_ColumnClick() berikut Prosedur Acara:

Private Sub ListView1_ColumnClick(ByVal ColumnHeader As Object)
' When a ColumnHeader object is clicked, the ListView control is
' sorted by the subitems of that column.

With Me.ListView1
' Set the SortKey to the Index of the ColumnHeader - 1
    .SortKey = ColumnHeader.Index - 1
    
 If .SortOrder = lvwAscending Then
    .SortOrder = lvwDescending
 Else
    .SortOrder = lvwAscending
 End If
 ' Set Sorted to True to sort the list.
     .Sorted = True
End With
End Sub

Catatan: Penyortiran semua data hanya dalam mode perbandingan teks. Item Daftar dan ListSubItems Tambah() Parameter ketiga metode, informasi yang ditampilkan pada Kontrol ListView adalah Teks Tipe. Tanggal dan Nilai Numerik semuanya diperlakukan sebagai Teks saja.

Windows Explorer menyimpan urutan item yang terakhir diurutkan dalam folder. Ketika kita membuka folder itu lagi daftar akan ditampilkan dalam urutan yang diurutkan sebelumnya.

Dengan Form_Unload() Prosedur Acara fitur Windows Explorer ini menjadi mungkin di Tabel Karyawan. Saat Anda menutup Formulir setelah mengurutkan pada kolom mana pun, urutan urutan yang diindeks akan disimpan di Tabel Karyawan di bidang ID. Kueri KaryawanQ selalu mengurutkan data pada bidang ID saat dibuka.

Basis data Demo terlampir untuk Mengunduh. Ada dua bentuk demo di Database. Formulir pertama menunjukkan pembukaan Tabel dan Kueri di Kontrol ListView untuk melihat data dalam Tampilan Lembar Data. Formulir kedua hanya menggunakan KaryawanQ Kueri saja untuk Seret, Jatuhkan, Urutkan, dan simpan urutan pengurutan data terakhir untuk penggunaan di masa mendatang.



  1. Tutorial Kontrol ActiveX ListView-01.
  2. Tutorial Kontrol ListView-02.
  3. Menetapkan Gambar ke Item ListView.
  4. Kontrol ListView Seret-Lepas Peristiwa Urutkan
  5. Kontrol ListView Dengan MS-Access TreeView
  6. TreeView/ListView Mengontrol Peristiwa Seret-Lepas

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pengantar Pertanyaan Khusus

  2. Cara Membuka Database dalam Mode Eksklusif di Access 2016

  3. 7 Basis Data Teratas

  4. Bagaimana Profesional Real Estat Dapat Menggunakan Microsoft Access

  5. 4 Cara Melindungi Informasi Sensitif dari Pelanggan Anda