datagridview 单元格 combox样式

帅比萌擦擦* 提交于 2019-12-02 12:16:00
  1. 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并不能很好的覆盖单元格(不知道为啥)。 第一种方法也有类似问题,发现点击展开箭头后(做选择或不做选择),若该单元格还处于选中状态,则单元格下方也会有个小缝隙。
方法2
方法1
方法1

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!