This example shows how to filter the items in a comboboxcolumn in a
datagrid. It is based on code found in the DataGridView Faq. Basically the
code filters the items in the combobox in the cell begin edit event and removes
the filter in the Cell end edit event.
Imports System.Data.SqlClient
Public Class Form1
Dim dv As DataView
Dim ds As New DataSet
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim dt As New DataTable
Dim strConn As String
Dim da, daProducts As SqlDataAdapter
Dim conn As SqlConnection
strConn = "Server = .;Database = NorthWind; Integrated Security = SSPI;"
conn = New SqlConnection(strConn)
da = New SqlDataAdapter("Select * from Categories", conn)
daProducts = New SqlDataAdapter("Select * from Products", conn)
da.Fill(ds, "Categories")
daProducts.Fill(ds, "Products")
dt.Columns.Add("Category", GetType(Integer))
dt.Columns.Add("Product")
DataGridView1.AutoGenerateColumns = False
DataGridView1.DataSource = dt
Dim dgvCombo As New DataGridViewComboBoxColumn
With dgvCombo
.Width = 150
.DataSource = ds.Tables("Categories")
.DisplayMember = "CategoryName"
.DataPropertyName = "CategoryID"
.ValueMember = "CategoryID"
.HeaderText = "Category"
End With
dv = New DataView(ds.Tables("Products"))
DataGridView1.Columns.Add(dgvCombo)
Dim dgvFilter As New DataGridViewComboBoxColumn
With dgvFilter
.Width = 150
.DisplayMember = "ProductName"
.DataPropertyName = "ProductName"
.HeaderText = "Product"
End With
DataGridView1.Columns.Add(dgvFilter)
End Sub
Private Sub DataGridView1_CellBeginEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles DataGridView1.CellBeginEdit
If e.ColumnIndex = 1 Then
Dim dgvCbo As DataGridViewComboBoxCell = TryCast(DataGridView1(e.ColumnIndex, e.RowIndex), DataGridViewComboBoxCell)
If dgvCbo IsNot Nothing Then
Dim str As String = DataGridView1.Item(0, DataGridView1.CurrentRow.Index).Value.ToString
dv = New DataView(ds.Tables("Products"))
dv.RowFilter = "CategoryID = " & str
dgvCbo.DataSource = dv
End If
End If
End Sub
Private Sub DataGridView1_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
If e.ColumnIndex = 2 Then
Dim dgvCbo As DataGridViewComboBoxCell = TryCast(DataGridView1(e.ColumnIndex, e.RowIndex), DataGridViewComboBoxCell)
If dgvCbo IsNot Nothing Then
dv = New DataView(ds.Tables("Products"))
dgvCbo.DataSource = dv
End If
End If
End Sub
Private Sub DataGridView1_DataError(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles DataGridView1.DataError
e.Cancel = True
End Sub
Private Sub DataGridView1_DefaultValuesNeeded(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowEventArgs) Handles DataGridView1.DefaultValuesNeeded
e.Row.Cells(0).Value = 1
End Sub
End Class