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.
-
Buat Tabel baru dengan satu bidang Teks, dengan nama bidang DataList .
-
Simpan Tabel dengan nama lvTables (lv adalah singkatan dari ListView).
-
Buka Tabel dalam Tampilan Lembar Data.
-
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.
-
Buat dan buka Formulir baru di Design View.
-
Masukkan Kontrol ListBox pada formulir, tampilkan Lembar Properti dan ubah Nama nilai properti menjadi List0 .
-
Ubah label turunannya Keterangan nilai ke Tabel .
-
Tampilkan lembar properti kontrol ListBox dan atur Sumber Baris nilai properti ke lvTables nama.
-
Periksa apakah Jenis Sumber Baris ditetapkan sebagai Tabel/Kueri dan nilai properti Kolom Terikat adalah 1. Jika berbeda maka ubah.
-
Masukkan Kontrol ListView dari Daftar Kontrol ActiveX dan ubah Nilai Properti Nama menjadi ListView1 .
-
Ubah ukuran kedua kontrol seperti yang ditunjukkan pada gambar Formulir demo yang diberikan di atas.
-
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.
-
Buat Tombol Perintah di bawah Kontrol dan ubah nilai properti Name menjadi cmdClose dan nilai properti Caption menjadi Tutup .
-
Klik kanan pada ListView Control, sorot ListViewCtrl Object pilihan, dan pilih Properti .
-
Ubah pengaturan properti agar sesuai dengan pengaturan di Umum Gambar tab diberikan di bawah ini.
-
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:
-
Teks (kolom pertama) ListItem nilai parameter adalah nama karyawan dan disusun dalam Urutan Abjad.
-
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.
-
Kami mengambil Teks Nilai (Nama Karyawan) dari ListItem pertama dan cari nama di tabel.
-
Ketika catatan ditemukan, nomor Indeks ListItem saat ini diperbarui (diganti) pada bidang ID di atas meja.
-
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.
- Tutorial Kontrol ActiveX ListView-01.
- Tutorial Kontrol ListView-02.
- Menetapkan Gambar ke Item ListView.
- Kontrol ListView Seret-Lepas Peristiwa Urutkan
- Kontrol ListView Dengan MS-Access TreeView
- TreeView/ListView Mengontrol Peristiwa Seret-Lepas