'
打开窗体代码窗口,在代码窗口中声明一个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
' // 定义下拉列表框
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