- datagridview控件单元格自带combox样式,即添加列时,类型选为:DataGridViewComboBoxColumn,并可在列的Items中增加下拉项。或通过语句实现:
((DataGridViewComboBoxColumn)dataGridView1.Columns[1]).Items.AddRange
(new object[] { "", "1", "2", "3", "4" });
***第一个值为空,意思是可以不做选择,这样在自增行时,也不会因为没有选择-没有对应combox的item而报错。***无论是在设计窗口设计dgv的列还是用代码写出来,这都属于先设计后赋值吧,这种情况一整列的下拉框内容都是一样的。
之前只知道把控件拖进设计窗口,直接程序写的话就没有头绪,今天猛然间意识到,我可以先把控件拖进设计窗口,然后看designer中是怎么写的,这样不就很清楚了吗!!!自己之前真是太笨了,哈哈
2. 目前我们的程序中都是dgv直接绑定数据源,dgv呢,就随着数据源变化,没有做单独的设计,当需要增加combox样式时,为了使变动尽可能最小,所以想到可以直接创建一个combox控件,然后覆盖原有的单元格。可以把combox的绘制放在dgv的CurrentCellChanged、MouseEnter等事件里,设置combox的位置,以及Items。
ComboBox combText = new ComboBox();
this.Controls.Add(combText);
combText.BringToFront();//需要把它放在最前,不然可能会被dgv挡住
private void dataGridView1_CurrentCellChanged(object sender, EventArgs e)
{
try
{
Rectangle rect = dataGridView1.GetCellDisplayRectangle(dataGridView1.CurrentCell.ColumnIndex, dataGridView1.CurrentCell.RowIndex, false);
string cvalue = dataGridView1.CurrentCell.Value.ToString();
combText.Location = this.PointToClient(dataGridView1.PointToScreen(new Point(rect.Left, rect.Top)));
combText.Width = rect.Width;
combText.Height = rect.Height;
combText.DataSource = InitCombox(cvalue);
combText.SelectedItem = cvalue;
combText.Visible = true;
}
catch (Exception ex) { }
}
写在最后,第二种方法,combox并不能很好的覆盖单元格(不知道为啥)。 第一种方法也有类似问题,发现点击展开箭头后(做选择或不做选择),若该单元格还处于选中状态,则单元格下方也会有个小缝隙。