' 打开窗体代码窗口,在代码窗口中声明一个ComboBox的控件 ' // 定义下拉列表框 Private cmb_Temp As New ComboBox Private Sub Form2_Load() Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 绑定性别下拉列表框 BindSex() '绑定数据表 BindData() ' 设置下拉列表框不可见 cmb_Temp.Visible = False ' 添加下拉列表框事件 AddHandler cmb_Temp.SelectedIndexChanged, AddressOf cmb_Temp_SelectedIndexChanged ' 将下拉列表框加入到DataGridView控件中 Me.dgv_User.Controls.Add(cmb_Temp) End Sub Public Sub BindSex() Sub BindSex() Dim dtSex As New DataTable dtSex.Columns.Add("Value") dtSex.Columns.Add("Name") Dim drSex As DataRow drSex = dtSex.NewRow() drSex("Value") = "0" drSex("Name") = "男" dtSex.Rows.Add(drSex) drSex = dtSex.NewRow() drSex("Value") = "1" drSex("Name") = "女" dtSex.Rows.Add(drSex) cmb_Temp.ValueMember = "Value" cmb_Temp.DisplayMember = "Name" cmb_Temp.DataSource = dtSex cmb_Temp.DropDownStyle = ComboBoxStyle.DropDownList End Sub ' 通常情况下我们都是从数据库中获取数据表(或者数据集),然后绑定到DataGridView中的,这里我们为了避免连接数据库,手中构造一个数据库表,代码如下: Private Sub BindData() Sub BindData() Dim dtData As New DataTable dtData.Columns.Add("ID") dtData.Columns.Add("Name") dtData.Columns.Add("Sex") Dim drData As DataRow drData = dtData.NewRow() drData("ID") = 1 drData("Name") = "张三" drData("Sex") = "1" dtData.Rows.Add(drData) drData = dtData.NewRow() drData("ID") = 2 drData("Name") = "李四" drData("Sex") = "1" dtData.Rows.Add(drData) drData = dtData.NewRow() drData("ID") = 3 drData("Name") = "王五" drData("Sex") = "1" dtData.Rows.Add(drData) drData = dtData.NewRow() drData("ID") = 4 drData("Name") = "小芳" drData("Sex") = "0" dtData.Rows.Add(drData) drData = dtData.NewRow() drData("ID") = 5 drData("Name") = "小娟" drData("Sex") = "0" dtData.Rows.Add(drData) drData = dtData.NewRow() drData("ID") = 6 drData("Name") = "赵六" drData("Sex") = "1" dtData.Rows.Add(drData) dgv_User.DataSource = Nothing Me.dgv_User.DataSource = dtData End Sub ' 当用户选择的单元格移动到性别这一列时,我们要显示下拉列表框,添加如下事件 Private Sub dgv_User_CurrentCellChanged() Sub dgv_User_CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles dgv_User.CurrentCellChanged Try If Not Me.dgv_User.CurrentCell Is Nothing AndAlso Me.dgv_User.CurrentCell.ColumnIndex = 2 Then Dim rect As Rectangle = dgv_User.GetCellDisplayRectangle(dgv_User.CurrentCell.ColumnIndex, dgv_User.CurrentCell.RowIndex, False) Dim sexValue As String = dgv_User.CurrentCell.Value.ToString() If sexValue = "男" Then cmb_Temp.Text = "男" cmb_Temp.Left = rect.Left cmb_Temp.Top = rect.Top cmb_Temp.Width = rect.Width cmb_Temp.Height = rect.Height cmb_Temp.Visible = True Else cmb_Temp.Text = "女" cmb_Temp.Left = rect.Left cmb_Temp.Top = rect.Top cmb_Temp.Width = rect.Width cmb_Temp.Height = rect.Height cmb_Temp.Visible = True End If Else cmb_Temp.Visible = False End If Catch ex As Exception End Try End Sub ' 当用户选择下拉列表框时改变DataGridView单元格的内容 Private Sub cmb_Temp_SelectedIndexChanged() Sub cmb_Temp_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) If CType(sender, ComboBox).Text = "男" Then dgv_User.CurrentCell.Value = "男" dgv_User.CurrentCell.Tag = "0" Else dgv_User.CurrentCell.Value = "女" dgv_User.CurrentCell.Tag = "1" End If End Sub ' 当滚动DataGridView或者改变DataGridView列宽时将下拉列表框设为不可见() Private Sub dgv_User_Scroll() Sub dgv_User_Scroll(ByVal sender As Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles dgv_User.Scroll Me.cmb_Temp.Visible = False End Sub Private Sub dgv_User_ColumnWidthChanged() Sub dgv_User_ColumnWidthChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewColumnEventArgs) Handles dgv_User.ColumnWidthChanged Me.cmb_Temp.Visible = False End Sub ' 绑定数据表后将性别列中的每一单元格的Value和Tag属性(Tag为值文本, Value为显示文本) Private Sub dgv_User_DataBindingComplete() Sub dgv_User_DataBindingComplete(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewBindingCompleteEventArgs) Handles dgv_User.DataBindingComplete Try For i As Integer = 0 To Me.dgv_User.Rows.Count - 1 If (Not dgv_User.Rows(i).Cells(2).Value Is Nothing) AndAlso dgv_User.Rows(i).Cells(2).ColumnIndex = 2 Then dgv_User.Rows(i).Cells(2).Tag = dgv_User.Rows(i).Cells(2).Value.ToString() If dgv_User.Rows(i).Cells(2).Value.ToString() = "0" Then dgv_User.Rows(i).Cells(2).Value = "男" ElseIf dgv_User.Rows(i).Cells(2).Value.ToString() = "1" Then dgv_User.Rows(i).Cells(2).Value = "女" End If End If Next Catch ex As Exception End Try End Sub