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