在DataGridView列中嵌入ComboBox(vb.net版)【原创】

最近在做一个程序,用DataGridView中自带的DataGridViewComboBoxColumn列动态生成下拉列表,真是问题多多

所有想在DataGridView列中嵌入ComboBox以实现动态生成下拉列表的目的

最后找到http://www.cnblogs.com/luqingfei/archive/2007/03/28/691372.html,但是C#版,我做的程序是VB.NET的

最后费了九牛之力,参照上面文章中源码,做成了VB.NET版的,我想有不少朋友需要,不惜放源出来,与大家一起学习

 

1 Imports System
2   Imports System.Data
3   Imports System.Collections.Generic
4   Imports System.Drawing
5   Imports System.Text
6
7 Public Class Form1
8 Dim cmb_Temp As New ComboBox
9
10
11 Private Sub Form1_Load( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase .Load
12 ' 绑定性别下拉列表框
13 BindSex()
14 ' 绑定数据表
15 BindData()
16 ' 设置下拉列表框不可见
17 cmb_Temp.Visible = False
18 ' 添加下拉列表框事件
19 AddHandler cmb_Temp.SelectedIndexChanged, AddressOf cmb_Temp_SelectedIndexChanged
20
21 ' 将下拉列表框加入到DataGridView控件
22 dgv_User.Controls.Add(cmb_Temp)
23 End Sub
24
25
26 ''' <summary>
27 ''' 绑定性别下拉列表框
28 ''' </summary>
29 Sub BindSex()
30 Dim dtSex As DataTable = New DataTable
31 dtSex.Columns.Add( " Value " )
32 dtSex.Columns.Add( " Name " )
33 Dim drSex As DataRow
34 drSex = dtSex.NewRow
35 drSex.Item( 0 ) = " 1 "
36 drSex.Item( 1 ) = " "
37 dtSex.Rows.Add(drSex)
38 drSex = dtSex.NewRow()
39 drSex.Item( 0 ) = " 0 "
40 drSex.Item( 1 ) = " "
41 dtSex.Rows.Add(drSex)
42 ' cmb_Temp.ValueMember = "Value"
43 cmb_Temp.ValueMember = " Value "
44
45 cmb_Temp.DisplayMember = " Name "
46 cmb_Temp.DataSource = dtSex
47 cmb_Temp.DropDownStyle = ComboBoxStyle.DropDownList
48 End Sub
49
50 ''' <summary>
51 ''' 创建DataGridView数据表
52 ''' </summary>
53 Sub BindData()
54 Dim dtData As DataTable = New DataTable
55 dtData.Columns.Add( " ID " )
56 dtData.Columns.Add( " Name " )
57 dtData.Columns.Add( " Sex " )
58 Dim drData As DataRow
59
60 drData = dtData.NewRow()
61 drData.Item( 0 ) = 1
62 drData.Item( 1 ) = " 张三 "
63 drData.Item( 2 ) = " 1 "
64 dtData.Rows.Add(drData)
65 drData = dtData.NewRow()
66 drData.Item( 0 ) = 2
67 drData.Item( 1 ) = " 李四 "
68 drData.Item( 2 ) = " 1 "
69 dtData.Rows.Add(drData)
70 drData = dtData.NewRow()
71 drData.Item( 0 ) = 3
72 drData.Item( 1 ) = " 王五 "
73 drData.Item( 2 ) = " 1 "
74 dtData.Rows.Add(drData)
75 drData = dtData.NewRow()
76 drData.Item( 0 ) = 4
77 drData.Item( 1 ) = " 小芳 "
78 drData.Item( 2 ) = " 0 "
79 dtData.Rows.Add(drData)
80 drData = dtData.NewRow()
81 drData.Item( 0 ) = 5
82 drData.Item( 1 ) = " 小娟 "
83 drData.Item( 2 ) = " 0 "
84 dtData.Rows.Add(drData)
85 drData = dtData.NewRow()
86 drData.Item( 0 ) = 6
87 drData.Item( 1 ) = " 赵六 "
88 drData.Item( 2 ) = " 1 "
89 dtData.Rows.Add(drData)
90 dgv_User.DataSource = dtData
91 End Sub
92 Private Sub dgv_User_CurrentCellChanged( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dgv_User.CurrentCellChanged
93 ' 当用户选择的单元格移动到性别这一列时,我们要显示下拉列表框
94 Try
95 If dgv_User.CurrentCell.ColumnIndex = 2 Then
96 ' 获取位置
97 Dim rect As Rectangle = dgv_User.GetCellDisplayRectangle(dgv_User.CurrentCell.ColumnIndex, dgv_User.CurrentCell.RowIndex, False )
98 Dim sexValue As String = dgv_User.CurrentCell.Value.ToString()
99 If sexValue = " 1 " Then
100 cmb_Temp.Text = " "
101 Else
102 cmb_Temp.Text = " "
103 End If
104 ' 设置组合框位置
105 cmb_Temp.Location = New Point(rect.X, rect.Y)
106 cmb_Temp.Width = rect.Width
107 cmb_Temp.Height = rect.Height
108 cmb_Temp.Visible = True
109 Else
110 cmb_Temp.Visible = False
111 End If
112 Catch ex As Exception
113 End Try
114 End Sub
115
116 ''' <summary>
117 ''' 选择项目后,填充单元格内容
118 ''' </summary>
119 Sub cmb_Temp_SelectedIndexChanged( ByVal sender As Object , ByVal e As EventArgs)
120
121 If TypeOf sender Is ComboBox Then
122 If CType (sender, ComboBox).Text = " " Then
123 dgv_User.CurrentCell.Value = " "
124 dgv_User.CurrentCell.Tag = " 1 "
125
126 Else
127 dgv_User.CurrentCell.Value = " "
128 dgv_User.CurrentCell.Tag = " 0 "
129 End If
130 End If
131 End Sub
132
133 ''' <summary>
134 ''' 当滚动DataGridView或者改变DataGridView列宽时将下拉列表框设为不可见
135 ''' </summary>
136 Private Sub dgv_User_Scroll( ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles dgv_User.Scroll
137 cmb_Temp.Visible = False
138 End Sub
139 Private Sub dgv_User_ColumnWidthChanged( ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewColumnEventArgs) Handles dgv_User.ColumnWidthChanged
140 cmb_Temp.Visible = False
141 End Sub

 

 

 

 

你可能感兴趣的:(datagridview)