Selasa, 14 Mei 2013

Suatu ketika saya di beri job oleh atasan untuk membuat sebuah aplikasi yang cara pengunaanya nanti oleh user hanya tinggal klik pada daftar data yang tampil. Saya pikir itu gampang makanya langsung saya katakan "ok pak". Dan 3 hari program pun selesai dan saya presentasikan.  Namun saat presentasi ada request pada tampilan data (saya pake listview) yang akan di klik terdapat pilihan dengan combobox karena aktual data lapangan seperti itu (terdapat beberapa pertimbangan untuk memilih data).
Listview dengan combo box???? langsung itu yang terlintas dipikiran saya, agak susah karena pada listview tidak ada fasilitas menampilkan combobox. saya pikir jika saya ganti ke datagrid bakal lama lagi trus data grid gak serapih listview tampilannya. Coba otak-atik program dan alhamdulillah akhirnya ketemu caranya.

Sekedar primbon pribadi aja, berikut saya tuliskan caranya:

- Buat desain form seperti berikut


- Kemudian tuliskan kode berikut untuk mengisi listview ( lebih bagus ngambil data dari database), saya contohkan sebagai berikut agar lebih cepat mengisinya (tanpa harus konek ke database dulu)

Private Sub Form_Load()
Dim i As Integer
Dim myList As ListItem

For i = 1 To 10
Set myList = Me.ListView1.ListItems.Add
myList.SubItems(1) = "Ini Kolom Ke2 Baris " & i
myList.SubItems(2) = "Ini Kolom Ke3 Baris " & i
myList.SubItems(3) = "Ini Kolom Ke4 Baris " & i
myList.SubItems(4) = "Ini Kolom Ke5 Baris " & i
Next
End Sub

- Kemudian kita buat fungsi untuk mendapatkan ukuran dan letak listview agar sesuai dengan 
   combobox

Function GetKolom(x!) As Long
Dim TempLebar() As Single
Dim TempBatasAwal() As Single
Dim TempBatasAkhir() As Single

Dim Lebar As Single
Dim i As Integer
Dim X1!, X2!

ReDim Preserve TempLebar(0)

TempLebar(0) = 0

For i = 1 To Me.ListView1.ColumnHeaders.Count
ReDim Preserve TempLebar(i)
ReDim Preserve TempBatasAwal(i)
ReDim Preserve TempBatasAkhir(i)

TempLebar(i) = Me.ListView1.ColumnHeaders(i).Width
Lebar = Lebar + TempLebar(i)
TempBatasAwal(i) = Lebar - TempLebar(i) + 1
TempBatasAkhir(i) = Lebar - 1
Next

For i = 1 To Me.ListView1.ColumnHeaders.Count
If x >= TempBatasAwal(i) And x <= TempBatasAkhir(i) Then
GetKolom = i
Exit For
End If
Next
End Function

Function Baris() As Long
Baris = Me.ListView1.ListItems(ListView1.SelectedItem.Index).Index
End Function

- Lalu buat fungsi yang tujuannya agar saat kolom listview di klik, maka akan tampil   
   combobox pada baris tersebut

Sub EditList()
On Error Resume Next
Dim myList As ListItem
Set myList = Me.ListView1.SelectedItem
If myList Is Nothing Then Exit Sub
Me.Combo1.Visible = False
With Me.ListView1
Me.Combo1.Left = .Left + .ColumnHeaders(Kolom).Left + 130
Me.Combo1.Top = .Top + myList.Top + 70
Me.Combo1.Width = .ColumnHeaders(Kolom).Width - 50
If Kolom > 1 Then
Me.Combo1.Text = myList.SubItems(Kolom - 1)
Else
Me.Combo1.Text = myList.Text
End If
Me.Combo1.Visible = True
Me.Combo1.SetFocus
End With
End Sub

-Panggil fungsi -fungsi diatas dengan menuliskan kode berikut:

Private Sub ListView1_Mouseup(Button As Integer, _
Shift As Integer, x As Single, y As Single)
Kolom = GetKolom(x)
EditList
End Sub

- Tuliskan kode berikut untuk menjadikan isi listview berubah sesuai text pada combobox yang kita pilih

Private Sub Combo1_Click()
Set myList = Me.ListView1.ListItems(Baris())

If Kolom > 1 Then
myList.SubItems(Kolom - 1) = Me.Combo1.Text
Else
myList.Text = Me.Combo1.Text
End If
End Sub

Private Sub Combo1_GotFocus()
With Me.Combo1
.SelStart = 0
.SelLength = Len(.Text)
End With
End Sub

Private Sub Combo1_KeyPress(KeyAscii As Integer)
If (KeyAscii = 13) Then
Combo1.Visible = False
End If
End Sub

- Selesai,,,,,,,,, dan tampilannya seperti berikut:


*) o ya,  comboboxnya saya isi manual datanya (implementasinya seh bisa dari database), terus visible=false
==== Kalo kurang jelas silahkan tinggalkan pesan di kotak komentar,,,

5 komentar :

  1. mantap gan, ane nyari dari kemaren yang kaya gnian tapi baru ktemu sekarang,,
    ane coba gan, thx

    BalasHapus
  2. mas maaf mau tanya, itu kalo pake textbox bisa ga? caranya piye?? soale aku cuma pengen edit data yang ada di listview..
    trims

    BalasHapus
    Balasan
    1. Bisa,
      ganti ja combo dengan textbox trus sesuaiin kode programnya jadi textbox.
      ok sama-sama semoga membantu

      Hapus
  3. MAFF MAU TANYA Gan
    kalo datanya dari database acess 2002-2003 gmn source code nyaa
    thanks

    BalasHapus