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

Tutorial Kontrol ListView-02

Pengantar.

Lanjutan dari Tutorial Kontrol ActiveX ListView-01 minggu lalu.

Dalam sesi Tutorial ini, kita akan mempelajari cara mencari dan menemukan nilai baris dan kolom tertentu dan menampilkannya pada Kontrol Label pada Formulir. Ini sangat berguna ketika kita memiliki volume data yang besar di kontrol ListView. Kami juga akan mempelajari penggunaan beberapa pengaturan properti ListView.

Pertama-tama, kita akan melihat betapa mudahnya mengatur ulang kolom, seperti yang kita lakukan dengan Access Datasheet View seperti yang kita inginkan pada ListView Control. Kami telah menambahkan beberapa TextBox, ComboBox, Command Buttons, dan Label untuk memudahkan pemilihan parameter pencarian dan tampilan hasil pencarian.

Saya telah membuat beberapa perubahan pada data demo minggu lalu. Nilai kolom pertama yang saya ambil dari tabel karyawan dari database sampel Northwind.accdb. Membuat Query untuk menggabungkan Nilai LastName dan FirstName dengan nama field Student dan EmployeeID yang digunakan sebagai Key (X01, X02 ...).

Sebelum pergi untuk operasi pencarian, kami akan memeriksa bagaimana mengatur ulang kolom dengan metode drag and drop.

Catatan: Jika Anda belum membuka Halaman Tutorial sebelumnya dan ingin melanjutkan sesi ini, buka Halaman Tutorial-01 Kontrol ListView dan unduh database demo dari bagian bawah Halaman itu.

Buka zip file dan buka Database. Formulir Demo akan ditampilkan dalam Tampilan Normal.

  1. Buka Database Anda, dengan Formulir Demo sesi terakhir, atau Formulir yang telah Anda buat, buka dalam Tampilan Normal.

    Sekarang, kita akan mencoba menarik dan memindahkan kolom dari tengah daftar (misalnya kolom Bobot), dan melepaskannya ke Usia kolom dan lihat apa yang terjadi. Apa yang diharapkan terjadi adalah kolom Umur harus bergeser ke kanan dan memasukkan kolom yang masuk di tempatnya.

  2. Arahkan pointer mouse pada Column Header dengan nama Weight, klik dan tahan tombol kiri mouse. Saat Anda menekan tombol kiri mouse, header kolom akan bergerak sedikit ke bawah.

  3. Sekarang, coba tarik kolom ke kiri dan letakkan di kolom Usia .

    Tidak akan terjadi apa-apa, karena kami belum mengaktifkan fitur ini di Lembar Properti dan itu adalah satu-satunya pengaturan, kami perlu mengubah agar fitur ini berfungsi.

  4. Ubah Formulir di Design View.

  5. Klik kanan pada ListView Control dan sorot opsi ListViewCtrl Object dan pilih Properti.

  6. Ada opsi 'AllowColumnReorder ' di sisi kanan. Beri tanda centang untuk memilihnya, lalu klik Terapkan tombol diikuti oleh OK untuk menutup Tampilan Properti.

  7. Sekarang, coba ulangi langkah 2 dan 3 di atas dan lihat apa yang terjadi.

    Itulah satu-satunya pengaturan yang Anda perlukan untuk mengaktifkan fitur ini pada Kontrol ListView. Mungkin Anda berpikir, bagaimana dengan mengatur ulang baris?.

    Fungsi itu membutuhkan pemrograman beberapa Prosedur Acara seperti yang kita lakukan sebelumnya di TreeView Control Drag-Drop Events. Bagian itu akan kita lakukan setelah beberapa waktu.

  8. Anda dapat bereksperimen dengan kolom apa pun untuk dipindahkan ke mana pun Anda suka, termasuk kolom pertama juga.

Catatan: Sebelum Anda menjatuhkan kolom sumber, lihat bahwa kolom target ditutupi oleh bingkai kolom yang masuk sebelum mencoba menjatuhkan. Jika tidak, kolom yang masuk dapat bergeser ke posisi kolom berikutnya di sisi kanan.

Selanjutnya, kita akan belajar bagaimana menemukan beberapa informasi dari ListView dengan cepat, dengan asumsi bahwa kita memiliki volume data yang besar di dalamnya.

Kami telah menambahkan subrutin ke Modul Tutorial-01 untuk memuat Nama header Kolom ke dalam Kotak Kombo pada formulir dengan warna latar belakang merah. Nama Kolom akan digunakan untuk mencari nilai kolom (Usia, Tinggi, Berat, atau Kelas) seorang siswa.

Kode VBA Baru Ditambahkan ke Modul Kelas Formulir.

Prosedur VBA baru berikut ini ditambahkan ke Modul Kelas Formulir Tutorial minggu lalu:

txtColCombo membuat daftar Label Header Kolom (nama bidang) di ComboBox. Salah satu detail dari Usia, Tinggi, Berat, Siswa ini atau Kelas dapat ditemukan bersama dengan nama siswa sebagai bagian dari operasi pencarian-dan-temukan.

Private Sub txtColCombo()
'Column Header List Combo
Dim lvwColHead As MSComctlLib.ColumnHeader
Dim cboName As ComboBox

Set cboName = Me.txtCol
cboName.RowSourceType = "Value List"

For Each lvwColHead In lvwList.ColumnHeaders
    If lvwColHead.Index = 1 Then
        'Nothing
    Else
        cboName.AddItem lvwColHead.Text
    End If
Next
'cboName.DefaultValue = "=txtCol.Column(0, 0)"

Set lvwColHead = Nothing
Set cboName = Nothing
End Sub

Combobox tidak akan dimuat dengan nilai default nama Kolom Header. Jika dipilih nilai kolom Siswa tersebut akan ditampilkan di Label Besar di bawah Nama Siswa. Jika dibiarkan kosong, operasi pencarian hanya akan menemukan nama siswa.

Metode operasi pencarian sangat fleksibel dan cepat. Kami memiliki dua metode untuk menemukan catatan.

Temukan catatan dengan menyediakan teks pencarian. Teks pencarian dapat dari salah satu kolom baik teks secara penuh atau sebagian karakter dari kiri. Karena kita memiliki dua kategori anggota objek dalam satu baris dalam kontrol ListView:ListItem - kolom pertama dan kolom lainnya adalah ListSubItems. Operasi pencarian teks pada objek ini dilakukan secara terpisah.

Grup opsi dengan dua Kotak Centang disediakan di sebelah Kotak Teks input teks pencarian pada Formulir untuk memilih opsi pencarian dan temukan. Opsi pertama dipilih secara default dan pencarian dilakukan pada Kolom pertama (ListItem ) untuk mencari teks yang diberikan.

Pilih opsi kedua untuk mencari teks di ListSubItem kolom.

Catatan: Menata ulang kolom tidak akan mengubah objek, tetapi hanya posisi tampilannya. Menyeret ListSubItem kolom dan membawanya di kolom pertama tidak akan berubah menjadi ListItem objek.

Jika Anda ingin mengambil nilai yang tidak diketahui dari kolom tertentu, pilih nama kolom dari ComboBox yang diberikan di bawah TextBox pertama pada Formulir untuk teks pencarian. Misalnya, Anda tidak tahu pengukuran Tinggi badan seorang siswa dan ingin mengetahuinya, pilih nama kolom Tinggi Badan dari ComboBox.

Setelah menyetel nilai di atas, klik Temukan Item Tombol Perintah untuk melakukan operasi pencarian. Jika pencarian berhasil, maka hasilnya akan ditampilkan dalam kontrol Label besar di bawah Tombol Perintah.

Klik Tombol Perintah [Temukan Item].

Memanggil SearchAndFind() Prosedur.

Private Sub SearchAndFind()
'Find by Student Name
Dim lstItem As MSComctlLib.ListItem
Dim strFind As String
Dim strColName As String
Dim strColVal As String
Dim j As Integer
Dim intOpt As Integer
Dim msgText As String

Me.Refresh
intOpt = Me.Opts


strFind = Nz(Me![txtFind], "")
strColName = Nz(Me![txtCol], "")

Select Case intOpt
    Case 1
        Set lstItem = lvwList.FindItem(strFind, , , lvwPartial)
    
        If Not lstItem Is Nothing Then
            j = lstItem.Index
            'format the display text
            msgText = lvwList.ColumnHeaders.Item(1).Text
            msgText = msgText & " : " & lstItem.Text & vbCr & vbCrLf
        Else
            MsgBox "Text '" & strFind & "' Not Found!", vbOKOnly + vbCritical, "cmdFind_Click()"
            Exit Sub
        End If
    Case 2
        Set lstItem = lvwList.FindItem(strFind, lvwSubItem, , lvwPartial)
        If Not lstItem Is Nothing Then
       'format the display text
            j = lstItem.Index
            msgText = lvwList.ColumnHeaders.Item(1).Text
            msgText = msgText & ": " & lstItem.Text & vbCr & vbCrLf
        Else
            MsgBox strFind & " Not Found!", vbOK + vbCritical, "cmdFind_Click()"
            Exit Sub
        End If
End Select

        If Len(strColName) = 0 Then 'If column name is not selected
            GoTo nextStep
        Else
            'Get the column value
            strColVal = GetColVal(lstItem, strColName)
            msgText = msgText & String(8 - (Len(strColName)), " ") & _
            strColName & ": " & Nz(strColVal, "")
        End If
nextStep:

If Len(msgText) > 0 Then 'assign to form label
    lvwList.ListItems.Item(j).Selected = True
    lblMsg.caption = msgText
End If

End Sub

Pada awal program, baik Nama Mahasiswa dan Nama Kolom ( 0pilihan), disalin dari TextBox ke dalam Variabel strFind dan strColName masing-masing setelah pemeriksaan validasi.

Catatan: Properti Not-in-List nama kolom Combo Box diatur ke Ya. Anda dapat memilih Nilai yang valid dari daftar atau mengetiknya atau membiarkan kotak kombo kosong. Jika Anda mengetikkan nilai lain yang tidak ada dalam daftar, nilai tersebut tidak akan diterima.

Berdasarkan Opsi pencarian yang dipilih (1 - ListItem atau 2 - ListSubItem), metode pemindaian diarahkan ke Objek yang ditentukan.

Menggunakan salah satu dari metode pencarian ini akan menemukan ListItem Object atau baris yang berisi teks pencarian. Nilai Indeks dari ListItem disimpan dalam Variabel J untuk digunakan nanti dalam program.

Catatan: Sistem membuat penomoran otomatis indeks secara otomatis pada saat item kontrol ListView diisi.

ListItem.Text nilai diambil. Informasi ini digabungkan dengan ColumnHeader pertama. Teks (seperti Siswa:Robert King) dan ditambahkan ke dalam string Msgtext untuk ditampilkan dalam kontrol Label pada Formulir.

Jika Nama Header kolom dipilih di ComboBox, maka GetColVal() Fungsi dipanggil dengan Obyek ListItem dan nilai Teks Tajuk Kolom sebagai parameter. Opsi ini bagus untuk mengambil informasi yang tidak diketahui tentang Siswa, seperti Tinggi siswa, dari catatan.

Kode VBA Fungsi GetColVal().

Private Function GetColVal(lvwItem As MSComctlLib.ListItem, ByVal colName As String) As String
Dim i As Integer
Dim strVal As String
    'first column is student name
    'check for column value from 2nd column onwards
    For i = 2 To lvwList.ColumnHeaders.Count
        If lvwList.ColumnHeaders(i).Text = colName Then 'if col name matches
            strVal = lvwItem.ListSubItems.Item(i - 1).Text 'get column value
            Exit For 'No further scanning required
        End If
    Next
GetColVal = strVal 'return the retrieved the value
End Function

Fungsi di atas meminta dua parameter. Parameter pertama adalah ListItem, di mana nama Siswa ditemukan. Parameter kedua adalah Nama Kolom. Usia, Tinggi, Berat, Kelas student siswa yang dipilih nilai disimpan di ListItem.ListSubItems Objek. Fungsi melihat melalui lvwList.ColumnHeader nilai untuk menemukan nama kolom yang cocok, ketika ditemukan bahwa nomor indeks kolom digunakan untuk mengambil nilai kolom dari Objek ListSubItems dan mengembalikan nilai ke program pemanggil.

Prosedur Peristiwa Klik Tombol Perintah [Temukan Dengan Kunci].

Kami memiliki metode lain yang ditambahkan untuk menemukan Nama Siswa menggunakan Nilai Kunci Unik dari ListItem jika digunakan saat membuat Daftar ListItem. Meskipun opsional, lebih baik menambahkan Nilai String Kunci Unik (harus dimulai dengan karakter alfabet) daripada mengabaikannya.

Misalnya, jika kita harus mencari informasi seseorang dengan nomor identifikasi mereka seperti Nomor Jaminan Sosial, Nomor Kartu Tanda Penduduk, Nomor Paspor atau Nomor SIM dan sebagainya, salah satu informasi ini dapat digunakan sebagai nilai Kunci untuk ListItem. Menemukan catatan dengan Nilai Unik ini sangat mudah dan lebih cepat daripada metode pencarian-dengan-teks di atas.

Prosedur Peristiwa cmdKey_Click().

Calls FindByKey() Subroutine.
Private Sub FindByKey()
Dim colHeader As MSComctlLib.ColumnHeader
Dim lvItem As MSComctlLib.ListItem
Dim lvKeyVal As String
Dim lvColName As String
Dim txt As String
Dim msgText As String
Dim varcolVal As Variant

lvKeyVal = UCase(Nz(Me!txtKey, ""))
lvColName = Nz(Me!txtCol, "")

If len(lvKeyVal) > 0 then
On Error Resume Next 
Set lvItem = lvwList.ListItems.Item(lvKeyVal) 'get the item by Key
If Err > 0 Then
    Err.Clear
    MsgBox "Key Value: '" & lvKeyVal & "' Not Found!", vbOKOnly + vbCritical, "cmdKey_Click()"
    On Error GoTo 0
    Exit Sub
End If
Else
	MsgBox "Please Provide a Valid Key-Value!",vbOKOnly + vbCritical, "cmdKey_Click()"
    Exit Sub
End If

txt = lvItem.Text 'get the student name
'format message text
msgText = lvwList.ColumnHeaders.Item(1).Text & " : "
msgText = msgText & txt & vbCr & vbCrLf

If Len(lvColName) > 0 Then 'if column name is given
    varcolVal = GetColVal(lvItem, lvColName) 'get column val of student
    msgText = msgText & String(8 - Len(lvColName), " ") & lvColName & ": " & varcolVal ' add it to display
End If

lvItem.Selected = True 'highlight the item on form
Me.lblMsg.caption = msgText 'assign details to form Label
End Sub

Seperti yang Anda lihat di subrutin di atas, kita bisa langsung menemukan ListItem di mana nama Siswa berada, dengan menggunakan Nilai Kunci, dengan satu pernyataan:Set lvItem =lvwList.ListItems.Item(xKeyVal).

Baris Berikutnya membaca Teks ListItem (atau nama Siswa) ke dalam Variabel txt . Dua baris berikutnya membuat teks pesan dengan Nama Siswa dalam variabel string msgText.

Selanjutnya Jika . . .Lalu pernyataan memeriksa apakah Nilai Nama Kolom dimasukkan dalam kontrol kotak kombo. Jika ditemukan, maka panggil GetColVal() Berfungsi dengan parameter yang diperlukan untuk menemukan nilai kolom dan mengambilnya di varColVal Variabel dan kembali ke program pemanggil. Nama Kolom dan nilainya yang diambil ditambahkan ke variabel string msgText untuk ditampilkan pada kontrol Label pada Formulir.

Pernyataan berikutnya menyoroti catatan Baris Siswa sebagai indikasi visual bahwa item yang dicari ditemukan di baris. Nilai msgText ditampilkan di Properti Caption Label pada Formulir.

Kode VBA Lengkap pada Modul Formulir.

Option Compare Database
Option Explicit

Dim lvwList As MSComctlLib.ListView 'ListView Control
Dim lvwItem As MSComctlLib.ListItem '
Dim ObjImgList As MSComctlLib.ImageList
Const prfx As String = "K"

Private Sub Form_Load()
    Call LoadListView
    Call txtColCombo
End Sub

Private Function LoadListView()
'Populate the ListView control with Student Details
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim intCounter As Integer
Dim strKey As String

'Assign ListView Control on Form to lvwList Object
 Set lvwList = Me.ListView1.Object
 
With lvwList
    .AllowColumnReorder = True
    .Enabled = True
    .Font = "Verdana"
    .Font.Bold = True
    .Font.Size = 9
    .ForeColor = vbBlack
    .BackColor = vbWhite
 End With
 
 'Create Column Headers for ListView
 With lvwList
    .ColumnHeaders.Clear 'initialize header area
    
   'Syntax: .ColumnHeaders.Add Index, Key, Text, Width, Alignment, Icon
    .ColumnHeaders.Add , , "Student", 2500
    .ColumnHeaders.Add , , "Age", 1200
    .ColumnHeaders.Add , , "Height", 1200
    .ColumnHeaders.Add , , "weight", 1200
    .ColumnHeaders.Add , , "Class", 1200
    
 End With
 
 'Initialize ListView Control
  While lvwList.ListItems.Count > 0
        lvwList.ListItems.Remove (1)
  Wend

'Student Names and Ids are taken from Employees Table
'through the StudentQ Query.
Set db = CurrentDb
Set rst = db.OpenRecordset("StudentQ", dbOpenDynaset)

With lvwList
    Do While Not rst.EOF And Not rst.BOF
        intCounter = rst![EmployeeID]
        strKey = "X" & Format(intCounter, "00") 'Key Value sample: X01
        
    'Syntax: .ListItems.Add(Index, Key, Text, Icon, SmallIcon)
        Set lvwItem = .ListItems.Add(, strKey, rst![Student])
        
        With lvwItem
    'Syntax: .Add Index,Key,Text,Report Icon,TooltipText
            .ListSubItems.Add , strKey & CStr(intCounter), CStr(5 + intCounter)
            .ListSubItems.Add , strKey & CStr(intCounter + 1), CStr(135 + intCounter)
            .ListSubItems.Add , strKey & CStr(intCounter + 2), CStr(40 + intCounter)
            .ListSubItems.Add , strKey & CStr(intCounter + 3), ("Class:" & Format(intCounter, "00"))

       End With
        rst.MoveNext
    Loop
rst.Close
Set rst = Nothing
Set db = Nothing
Set lvwItem = Nothing
End With
lvwList.Refresh

End Function


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

Private Sub cmdFind_Click()
Call SearchAndFind

End Sub

Private Sub cmdKey_Click()
Call FindByKey
End Sub

Private Function GetColVal(lvwItem As MSComctlLib.ListItem, ByVal colName As String) As String
Dim i As Integer
Dim strVal As String
    'first column is student name
    'check for column value from 2nd column onwards
    For i = 2 To lvwList.ColumnHeaders.Count
        If lvwList.ColumnHeaders(i).Text = colName Then 'if col name matches
            strVal = lvwItem.ListSubItems.Item(i - 1).Text 'get column value
            Exit For 'No further scanning required
        End If
    Next
GetColVal = strVal 'return the retrieved the value
End Function



Private Sub txtColCombo()
'Column Header List Combo
Dim lvwColHead As MSComctlLib.ColumnHeader
Dim cboName As ComboBox

Set cboName = Me.txtCol
cboName.RowSourceType = "Value List"

For Each lvwColHead In lvwList.ColumnHeaders
    If lvwColHead.Index = 1 Then
        'Nothing
    Else
        cboName.AddItem lvwColHead.Text
    End If
Next
'cboName.DefaultValue = "=txtCol.Column(0, 0)"

Set lvwColHead = Nothing
Set cboName = Nothing
End Sub


Public Sub SearchAndFind()
'Find by Student Name
Dim lstItem As MSComctlLib.ListItem
Dim strFind As String
Dim strColName As String
Dim strColVal As String
Dim j As Integer
Dim intOpt As Integer
Dim msgText As String

Me.Refresh
intOpt = Me.Opts

strFind = Nz(Me![txtFind], "")
strColName = Nz(Me![txtCol], "")

Select Case intOpt
    Case 1
        Set lstItem = lvwList.FindItem(strFind, , , lvwPartial)
        If Not lstItem Is Nothing Then
            j = lstItem.Index
            'format the display text
            msgText = lvwList.ColumnHeaders.Item(1).Text
            msgText = msgText & " : " & lstItem.Text & vbCr & vbCrLf
        Else
           MsgBox "Text '" & strFind & "' Not Found in the List!", vbOKOnly + vbCritical, "cmdFind_Click()"
        Exit Sub
        End If
    Case 2
        Set lstItem = lvwList.FindItem(strFind, lvwSubItem, , lvwPartial)
        If Not lstItem Is Nothing Then
       'format the display text
            j = lstItem.Index
            msgText = lvwList.ColumnHeaders.Item(1).Text
            msgText = msgText & ": " & lstItem.Text & vbCr & vbCrLf
        Else
            MsgBox strFind & " Not Found!", vbOK + vbCritical, "cmdFind_Click()"
            Exit Sub
        End If
End Select

        If Len(strColName) = 0 Then 'If column name is not selected
            GoTo nextStep
        Else
            'Get the column value
            strColVal = GetColVal(lstItem, strColName)
            msgText = msgText & String(8 - (Len(strColName)), " ") & _
            strColName & ": " & Nz(strColVal, "")
        End If
nextStep:

If Len(msgText) > 0 Then 'assign to form label
    lblMsg.caption = msgText
    lvwList.ListItems.Item(j).Selected = True
End If
End Sub

Public Sub FindByKey()
Dim colHeader As MSComctlLib.ColumnHeader
Dim lvItem As MSComctlLib.ListItem
Dim lvKeyVal As String
Dim lvColName As String
Dim txt As String
Dim msgText As String
Dim varcolVal As Variant


lvKeyVal = UCase(Nz(Me!txtKey, ""))
lvColName = Nz(Me!txtCol, "")

On Error Resume Next
If Len(lvKeyVal) > 0 Then
Set lvItem = lvwList.ListItems.Item(lvKeyVal) 'get the item by Key
    If Err > 0 Then
        Err.Clear
        MsgBox "Key Value: '" & lvKeyVal & "' Not Found!", vbOKOnly + vbCritical, "cmdKey_Click()"
       On Error GoTo 0
        Exit Sub
    End If
Else
    MsgBox "Please Provide a Valid Key-Value!", vbOKOnly + vbCritical, "cmdKey_Click()"
    Exit Sub
End If

txt = lvItem.Text 'get the student name
'format message text
msgText = lvwList.ColumnHeaders.Item(1).Text & " : "
msgText = msgText & txt & vbCr & vbCrLf

If Len(lvColName) > 0 Then 'if column name is given
    varcolVal = GetColVal(lvItem, lvColName) 'get column val of student
    msgText = msgText & String(8 - Len(lvColName), " ") & lvColName & ": " & varcolVal ' add it to display
End If

lvItem.Selected = True 'highlight the item on form
Me.lblMsg.caption = msgText 'assign details to form Label
End Sub

Unduh Demo Database dari Tautan berikut:



  1. Tutorial Kontrol Microsoft TreeView
  2. Membuat Menu Akses dengan Kontrol TreeView
  3. Menetapkan Gambar ke TreeView Nodes
  4. Menetapkan Gambar ke TreeView Nodes-2
  5. TreeView Control Tanda Centang Tambah Hapus
  6. Akses Drop-down TreeView ImageCombo
  7. Atur ulang Node TreeView Dengan Seret dan Lepas
  8. Kontrol ListView dengan MS-Access TreeView
  9. Acara Lepas Seret Kontrol ListView
  10. Kontrol TreeView Dengan Sub-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. Blok indah dari Boilerplate

  2. Pengantar Pemeliharaan Catatan

  3. Transformasi Fungsionalitas Kelas Pembungkus

  4. Mengatasi Kesalahan Ketidakcocokan Arsitektur Saat Menggunakan Microsoft Access

  5. Memigrasikan Access Database Anda ke SQL Server