首先 在DataGridView中为想要设置为下拉列表的列ColumnType属性设置为DataGridViewComboBoxColumn 这样该列单元格就会成为下拉列表的列
如果是连接数据库了,那么再在下面的DataPropertyName属性中写上已经连接好的库中表里的字段,最后再为ComboBox的Items中加入和数据库中数据相关的选项,这样就完成了下拉列表的功能。效果如下
你只需要添加一列类型为DataGridViewComboBoxColumn的列,然后添加数据源即可。但是我们看到这种方式的下拉列表看起来并不是十分的美观,至少我个人是这么觉得的。
不过上述方法做出来的效果貌似并不美观,于是便有另一种方法
//
将下拉列表加入到DataGridView的控件集合内,否则下拉列表不会显示在你点击的单元格上
dataGridView1.Controls.Add(comboBox1);
dataGridView1.Controls.Add(comboBox1);
然后监听DataGridView的CurrentCellChanged事件,执行如下的动作:
![](https://i-blog.csdnimg.cn/blog_migrate/3d61b3f7f73aefc0bb37345e44dd64b0.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/abb0a338df989936a3a3311f58b24711.gif)
1
private
void
dataGridView1_CurrentCellChanged(
object
sender, EventArgs e)
2 {
3 DataGridViewColumn column = dataGridView1.CurrentCell.OwningColumn;
4 // 如果是要显示下拉列表的列的话
5 if (column.Name.Equals( " Column2 " ))
6 {
7 int columnIndex = dataGridView1.CurrentCell.ColumnIndex;
8 int rowIndex = dataGridView1.CurrentCell.RowIndex;
9 Rectangle rect = dataGridView1.GetCellDisplayRectangle(columnIndex, rowIndex, false );
10 comboBox1.Left = rect.Left;
11 comboBox1.Top = rect.Top;
12 comboBox1.Width = rect.Width;
13 comboBox1.Height = rect.Height;
14 //将单元格的内容显示为下拉列表的当前项
15 string consultingRoom = dataGridView1.Rows[rowIndex].Cells[columnIndex].Value.ToString();
16 int index = comboBox1.Items.IndexOf(consultingRoom);
17
18 comboBox1.SelectedIndex = index;
19 comboBox1.Visible = true ;
20 }
21 else
22 {
23 comboBox1.Visible = false ;
24 }
25 }
2 {
3 DataGridViewColumn column = dataGridView1.CurrentCell.OwningColumn;
4 // 如果是要显示下拉列表的列的话
5 if (column.Name.Equals( " Column2 " ))
6 {
7 int columnIndex = dataGridView1.CurrentCell.ColumnIndex;
8 int rowIndex = dataGridView1.CurrentCell.RowIndex;
9 Rectangle rect = dataGridView1.GetCellDisplayRectangle(columnIndex, rowIndex, false );
10 comboBox1.Left = rect.Left;
11 comboBox1.Top = rect.Top;
12 comboBox1.Width = rect.Width;
13 comboBox1.Height = rect.Height;
14 //将单元格的内容显示为下拉列表的当前项
15 string consultingRoom = dataGridView1.Rows[rowIndex].Cells[columnIndex].Value.ToString();
16 int index = comboBox1.Items.IndexOf(consultingRoom);
17
18 comboBox1.SelectedIndex = index;
19 comboBox1.Visible = true ;
20 }
21 else
22 {
23 comboBox1.Visible = false ;
24 }
25 }
然后重绘下拉列表的每一项,如果不重绘的话,看不到下拉列表的每一项的内容,但是神奇的是可以选择(因为下拉列表此时是有内容的,只不过是没有显示出来)
![](https://i-blog.csdnimg.cn/blog_migrate/7d3e8bd211578c59553a9e4dad19218d.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6b26aa8e7367473e24c9279109b0d316.gif)
1
private
void
comboBox1_DrawItem(
object
sender, DrawItemEventArgs e)
2 {
3 e.DrawBackground();
4 e.Graphics.DrawString(comboBox1.Items[e.Index].ToString(), e.Font, Brushes.Black,
5 e.Bounds, StringFormat.GenericDefault);
6 }
2 {
3 e.DrawBackground();
4 e.Graphics.DrawString(comboBox1.Items[e.Index].ToString(), e.Font, Brushes.Black,
5 e.Bounds, StringFormat.GenericDefault);
6 }
最后在下拉列表选择项变化的时候,更改DataGridView相应的单元格的内容
![](https://i-blog.csdnimg.cn/blog_migrate/db446f1e9c043b03a34599343740f107.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/5afd59fc3582a4aed8739e893d189a38.gif)
1
private
void
comboBox1_SelectedIndexChanged(
object
sender, EventArgs e)
2 {
3 if (dataGridView1.CurrentCell != null )
4 dataGridView1.CurrentCell.Value = comboBox1.Items[comboBox1.SelectedIndex];
5 }
2 {
3 if (dataGridView1.CurrentCell != null )
4 dataGridView1.CurrentCell.Value = comboBox1.Items[comboBox1.SelectedIndex];
5 }