VB.NET: Filter ComboBox List di Row yang Sama Pada Datagridview

Rani mau coba jawab pertanyaan dari joe sath yang ada di artikel http://rani-irsan.blogspot.com/2014/04/vbnet-arrays.html
Cuman sebelumnya mau make sure dulu apa case nya seperti ini:
Ada 7 kolom yang bisa diisi dengan nama hari yang dipilih melalui combobox yang ada pada datagridview.
Berikut contoh list yang bisa dipilih pertama kali.
Nah klo udah ada yang dipilih dalam row yang sama tidak muncul lagi dipilihan, seperti gambar di bawah ini:
Begitu pula pilihan selanjutnya dan seterusnya dalam 1 row.
Tapi filter ini tidak berlaku pada baris baru.
Masing-masih row berlaku filter sendiri.

Bagaimana cara bikin nya? Baiklah kita mulai dengan membuat UI nya cukup form yang diisi dengan datagridview dengan property Dock = Fill.

Pada list Rani tambahkan 1 item berisi string kosong, untuk menjaga kemungkinan saat row terisi penuh semua ada nilai yang ingin ditukar.
Berikut ini code yang digunakan:
Public Class Form3

 Dim hari As String() = {"Senin", "Selasa", "Rabu"
, "Kamis", _
                            "Jum'at", "Sabtu", "Minggu"
}

 Function DayExistRow(ByVal row As Integer, _
          ByVal DayName As String) As Boolean
   Try
    For
x As Integer = 0 To DataGridView1.Columns.Count - 1
      If IsNothing(DataGridView1.Rows(row).Cells(x).Value) = False And _
        x <> DataGridView1.CurrentCell.ColumnIndex Then
        If DataGridView1.Rows(row).Cells(x).Value = DayName Then Return True
      End If

    Next
   Catch
ex As Exception
      MsgBox(ex.Message)
   End Try
   Return False
 End Function


 Sub SetListCombo(ByVal row As Integer, ByVal col As Integer)
   Dim cmb As New DataGridViewComboBoxCell
   cmb = DataGridView1.Rows(row).Cells("cmb" & (col + 1).ToString)
   cmb.Items.Clear()
   cmb.Items.Add("")
   For i As Integer = 0 To 6
       If DayExistRow(row, hari(i)) = False Then
           cmb.Items.Add(hari(i))
       End If
   Next
 End Sub


 Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load
   For i As Integer = 0 To 6
       Dim cmb As New DataGridViewComboBoxColumn()
       cmb.HeaderText = "Column" & (i + 1).ToString
       cmb.Name = "cmb" & (i + 1).ToString
       cmb.MaxDropDownItems = 7
       cmb.Items.Add("")
       For x As Integer = 0 To 6
           cmb.Items.Add(hari(x))
       Next
       DataGridView1.Columns.Add(cmb)
   Next
 End Sub

 Private Sub
DataGridView1_CellBeginEdit(sender As Object, _
     e As DataGridViewCellCancelEventArgs) _
     Handles DataGridView1.CellBeginEdit

   SetListCombo(e.RowIndex, e.ColumnIndex)

 End Sub

End Class

 

Click here if you like this article.


Post a Comment

11 Comments

Unknown said…
iya bener gini buk ^_^

keren kali buk :D


mmm ,,
pake percabangan juga ini buk ?
rani said…
udah rani update code nya, silahkan di cek lagih...
Unknown said…
makasih banyk buk, sudah bisa ^_^
panjang juga skripnya :D

fungsi event "CellBeginEdit" itu apa buk ?

sama huruf "e" pada skrip dibawah ini buk ?

SetListCombo(e.RowIndex, e.ColumnIndex)
rani said…
CellBeginEdit itu salah satu event yang ada pada control datagridview.
klo rani ga salah paham e itu parameter/argumen yang ada pada sebuah event procedure.
nah itu kan event nya CellBeginEdit yaitu saat sebuah cell yang ada pada datagridview mulai diedit jadi
e.RowIndex --> index baris cell yang lagi mulai diedit
e.ColumnIndex --> index kolom cell yang lagi mulai diedit
begituh kira2
Unknown said…
mmm ,,
gitu buk ^_^

makasih banyak ya buk atas pengetahuannya ,,

sekali lagi terimakasih buk :)
Unknown said…
This comment has been removed by the author.
rani said…
di form_load setelah proses looping ditambahkan baris code berikut:
DataGridView1.AllowUserToAddRows = False
DataGridView1.Rows.Add()
Unknown said…
iya buk maksih buk :)

kalo untuk menamai row header yg atas, disamping kolom header buk ?
klo skrip ini utk row header sebaris dengan row :
DataGridView1.Rows(0).HeaderCell.Value = "row header 1"

klo buat sebaris dengan kolom header bisa gridview dibuat gitu buk ?
rani said…
iya bener kayak gitu tinggal disesuaikan aja width nya
DataGridView1.RowHeadersWidth = 110
DataGridView1.Rows(0).HeaderCell.Value = "row header 1"

Buat sebaris gimana ya? Paling column header nya aja di hidden:
DataGridView1.ColumnHeadersVisible = False
Unknown said…
sejajar di colom header seperti gambar ini buk ?
http://s18.postimg.org/asl94svzt/nama_header_row_dan_kolom_2.jpg
rani said…
Oooooh bagian kiri atas DataGridView....
DataGridView1.TopLeftHeaderCell.Value = "TEST"