版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
在实际工作中,为了防止用户乱填写数据,开发者往往需要给出固定的几个值,用户只能在那几个值里面选择,
在datagridview中可以通过设置DataGridViewComboBoxCell 来实现,但是一列的下拉框单元格,没有文本单元格视觉效果那么好,造成用户体验并不是很好。
在本节内容中,我们将实现当点击文本单元格开始编辑时,就出现下拉框,编辑完成后又恢复为文本单元格。
首先明确几个概念:
1、datagridview控件可以包含子控件,通过datagridview.Controls 属性访问即可,这样就可以将ComboBox控件包含进去,当然其它控件也可以。
2、当ComboBox加入后,需要确定它的大小和位置,通过DataGridView.GetCellDisplayRectangle 方法即可。
Public Function GetCellDisplayRectangle ( columnIndex As Integer, rowIndex As Integer, cutOverflow As Boolean ) As Rectangle
参数
columnIndex :单元格的列索引。
rowIndex :单元格的行索引。
cutOverflow:如果只返回该单元格的显示部分,则为 true;如果返回整个单元格界限,则为 false。
返回值
Rectangle:表示单元格显示区域的矩形,也就获得了该区域的位置和尺寸。
获得Rectangle后,设置ComboBox的大小和位置与Rectangle相同就可以了。
3、ComboBox显示的时候:当点击需要的单元格时(CellClick)或者单元格获得焦点时(CellEnter)。
4、ComboBox隐藏的时候:但从ComboBox选择了值就可以让它消失了。
具体代码如下:
1、声明一个窗体级的ComboBox变量cb,声明两个Integer保存点击的行列的索引。
Dim cb As ComboBox
Dim cellrowindex, cellcolindex As Integer
2、当窗体载入后,将固定的值增加到cb中,为了限制用户输入,使用的是ComboBoxStyle.DropDownList,同时增加下拉框的索引改变事件(SelectedIndexChanged)
Private Sub Form5_Load(sender As Object, e As EventArgs) Handles MyBase.Load
cb = New ComboBox
cb.Items.Add("甲甲甲甲")
cb.Items.Add("乙乙乙乙")
cb.Items.Add("丙丙丙丙")
cb.DropDownStyle = ComboBoxStyle.DropDownList
cb.Visible = False
dgv.Controls.Add(cb)
AddHandler cb.SelectedIndexChanged, AddressOf cbChanged
End Sub
3、添加下拉框的SelectedIndexChanged事件具体代码,当选好值后将值传给对应的单元格,然后隐藏下拉框
Private Sub cbChanged(ByVal sender As Object, ByVal e As EventArgs)
dgv(cellcolindex, cellrowindex).Value = cb.Text
cb.Visible = False
End Sub
4、当点击第一列的单元格时显示出下拉框,同样为了限制用户输出,设置了下拉框的文本为第一个值,并设置它的大小和位置。如果点击的单元格有值,那么下拉框的文本设置为该值。
Private Sub dgv_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgv.CellClick
If e.ColumnIndex <> 0 Then
Exit Sub
End If
cellcolindex = e.ColumnIndex
cellrowindex = e.RowIndex
Dim cellvalue As String = dgv(e.ColumnIndex, e.RowIndex).Value
Dim rect As Rectangle
rect = dgv.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, True)
cb.Top = rect.Top
cb.Left = rect.Left
cb.Width = rect.Width
cb.Height = rect.Height
cb.Text = cellvalue
cb.Visible = True
End Sub
运行后,当点击第一列单元格时,下拉框就显示出来了:
选好之后,下拉框隐藏,但是单元格的值变成了下拉框的文本:
实际运行中,基本的功能已经实现,但是还有一些问题,在下一节《vb.net 教程 3-10 窗体编程 datagridview控件 17 实现文本单元格中显示下拉框并设置值(续)》中会讨论如何解决这些问题。
由于.net平台下C#和vb.Net很相似,本文也可以为C#爱好者提供参考。
学习更多vb.net知识,请参看vb.net 教程 目录