[Winform] 使DataGridView中设置的DataGridViewComboBox可编辑

在DataGridView中设置的DataGridViewComboBox,默认是不可编辑的,即使将其列属性DisplayStyle设置成ComboBox或其他,也无法编辑;

故作如下处理:

一  DataGridViewComboBoxCell

重写DataGridViewComboBox的单元控件DataGridViewComboBoxCell

  1 /// <summary>
  2 /// 自定义可编辑下拉框单元
  3 /// </summary>
  4 public class DataGridViewComboEditBoxCell : DataGridViewComboBoxCell
  5 {
  6     public override void InitializeEditingControl(int rowIndex, object initialFormattedValue,
  7         DataGridViewCellStyle dataGridViewCellStyle)
  8     {
  9         base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
 10
 11         ComboBox comboBox = (ComboBox)base.DataGridView.EditingControl;
 12         if (comboBox != null)
 13         {
 14             comboBox.DropDownStyle = ComboBoxStyle.DropDown;
 15             comboBox.AutoCompleteMode = AutoCompleteMode.Suggest;
 16             comboBox.Validating += new CancelEventHandler(comboBox_Validating);
 17         }
 18     }
 19
 20     protected override object GetFormattedValue(object value, int rowIndex,
 21         ref DataGridViewCellStyle cellStyle, TypeConverter valueTypeConverter,
 22         TypeConverter formattedValueTypeConverter, DataGridViewDataErrorContexts context)
 23     {
 24         if (value != null && value.ToString().Trim() != string.Empty)
 25         {
 26             if (Items.IndexOf(value) == -1)// 如果下拉框中不存在填入的值,则添加到下拉框中
 27             {
 28                 Items.Add(value);
 29                 // 添加到该列所有单元所绑定的下拉列表中
 30                 DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn)OwningColumn;
 31                 col.Items.Add(value);
 32             }
 33         }
 34
 35         return base.GetFormattedValue(value, rowIndex, ref cellStyle, valueTypeConverter, formattedValueTypeConverter, context);
 36     }
 37
 38     private void comboBox_Validating(object sender, CancelEventArgs e)
 39     {
 40         DataGridViewComboBoxEditingControl cbo = (DataGridViewComboBoxEditingControl)sender;
 41         if (cbo.Text.Trim() == string.Empty)
 42             return;
 43
 44         DataGridView grid = cbo.EditingControlDataGridView;
 45         object value = cbo.Text;
 46
 47         if (cbo.Items.IndexOf(value) == -1)
 48         {
 49             DataGridViewComboBoxColumn cboCol = (DataGridViewComboBoxColumn)grid.Columns[grid.CurrentCell.ColumnIndex];
 50             // 添加到当前下拉框中以及模版中,避免出现重复项
 51             cbo.Items.Add(value);
 52             cboCol.Items.Add(value);
 53             grid.CurrentCell.Value = value;
 54         }
 55     }
 56 }

DataGridViewComboEditBoxCell

1、GetFormattedValue方法

     获取单元格数据的格式化值。

protected override Object GetFormattedValue(
	Object value,// 要格式化的值
	int rowIndex,// 该单元格父行的索引
	ref DataGridViewCellStyle cellStyle,// 对单元格有效样式
	TypeConverter valueTypeConverter,// 与值类型关联的类型转换器,提供到格式化值类型的自定义转换
	TypeConverter formattedValueTypeConverter,// 与格式化值类型相关联的类型转换期,提供从该值类型进行的自定义转换
	DataGridViewDataErrorContexts context// 用于描述需要格式化的上下文
)
返回值:应用了格式设置之后单元格数据的值

2、InitializeEditingControl方法

     附加并初始化寄宿的编辑控件。

public override void InitializeEditingControl(
    int rowIndex,// 该单元格父行的索引
    Object initialFormattedValue,// 要在控件中显示的初始值
    DataGridViewCellStyle dataGridViewCellStyle// 寄宿控件的单元格样式
)

该方法主要操作设置宿主ComboBox控件的可视化属性(MaxDropDownItems, DropDownWidth, FlatStyle)、设置宿主ComboBox控件的数据绑定属性(DataSource, DisplayMember, ValueMember)、重新初始化宿主ComboBox控件的Items属性;

二  DataGridViewComboBoxColumn

重写DataGridViewComboBox的列控件DataGridViewComboBoxColumn,并设置其单元模版为上面自定义的单元

  1 public class DataGridViewComboEditBoxColumn : DataGridViewComboBoxColumn
  2 {
  3     public DataGridViewComboEditBoxColumn()
  4     {
  5         DataGridViewComboEditBoxCell obj = new DataGridViewComboEditBoxCell();
  6         this.CellTemplate = obj;
  7     }
  8 }
  9 

DataGridViewComboEditBoxColumn

三  应用自定义可编辑的DataGridViewComboEditBoxColumn

将DataGridViewComboEditBoxColumn的命名空间添加到相应的Form中,然后在DataGridView的Columns属性中对列进行编辑时,即可看到自定义的DataGridViewComboEditBoxColumn控件,如下图:

则可以达到如下效果

,在单元中编辑的项,均可在下拉框中找到记录;

四  参考资料

1、http://hi.baidu.com/guog_/item/13003e933738321f924f4157

2、GetFormattedValue:https://msdn.microsoft.com/zh-cn/library/ms158982(v=vs.90).aspx

3、InitializeEditingControl:http://msdn.microsoft.com/zh-tw/beginner/system.windows.forms.datagridviewcomboboxcell.initializeeditingcontrol(zh-cn,VS.100).aspx

时间: 2024-10-13 02:45:48

[Winform] 使DataGridView中设置的DataGridViewComboBox可编辑的相关文章

关于Winform下DataGridView中实现checkbox全选反选、同步列表项的处理

近期接手一个winform 项目,虽然之前有.net 的经验,但是对一些控件的用法还不是很熟悉. 这段时间将会记录一些在工作中遇到的坎坷以及对应的解决办法,写出来与大家分享并希望大神提出更好解决方法来促进进步. 我也会尽可能把我查找到资料的出处引出来,以此来感恩对我提供帮助的人们. 正题如下 一.关于Winform下DataGridView中实现checkbox全选反选.同步列表项的处理 1.checkbox的添加:在设计页面选择编辑列在新添加的列中注意如下几个属性: SortMode = No

【WinForm】DatagridView列宽设置与对齐方式

一.设置对齐方式 1.列标题居中对齐 dataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; 但实际上看上去仍然偏左,这是因为存在排序三角形,可以设置列的SortMode属性值为DataGridViewColumnSortMode.NotSortable,但是失去排序功能. 2.内容居中对齐 dataGridView1.DefaultCellStyle.A

c# WinForm开发 DataGridView控件的各种操作总结(单元格操作,属性设置)

一.单元格内容的操作 *****// 取得当前单元格内容 Console.WriteLine(DataGridView1.CurrentCell.Value); // 取得当前单元格的列 Index       Console.WriteLine(DataGridView1.CurrentCell.ColumnIndex); // 取得当前单元格的行 Index       Console.WriteLine(DataGridView1.CurrentCell.RowIndex); ******

winform 取消datagridview第一行选中状态

C# WinForm 取消DataGridView的默认选中Cell 使其不反蓝 http://www.cnblogs.com/freeliver54/archive/2009/02/16/1391325.html dataGridView1.Rows[0].Selected = false; 放在窗体的构造函数中 怎么都看似不起效果 首行首列还是反蓝 后来尝试放在窗体的Load中 终于看不不反蓝了 同时需要注意dataGridView1的TabIndex (可以手动修改F4 dataGridV

c#.net循环将DataGridView中的数据赋值到Excel中,并设置样式

Microsoft.Office.Interop.Excel.Application excel =                new Microsoft.Office.Interop.Excel.Application();            excel.SheetsInNewWorkbook = 1;            excel.Workbooks.Add(); //设置Excel列名            excel.Cells[1, 1] = "学号";     

winform 中设置窗体的默认焦点

转载:http://www.cnblogs.com/weekzero/p/3504513.html winform的窗体中,有时候需要设置默认焦点,有时候需要取消默认焦点. 设置默认焦点,最简单的方法就是设置这个控件的tabIndex,例:textBox1.TabIndex = 0; 也可以在窗体事件中用focus事件来实现,比如在Form的Activated事件中,如: private void Form1_Activated(object sender, EventArgs e) { tex

设置DataGridView中表头颜色

默认的DataGridView表头颜色实在不是太好看,想设置下,上google搜了一通, 都说这样设置 this.dataGridView1.ColumnHeadersDefaultCellStyle.ForeColor = Color.Red; 设置了,发现没有什么效果,好像也有人有同样的问题,就是没有人给出答案 . 还是在国外的一个网站上找到答案.原来要把“ "EnableHeaderVisualStyles”设置为false才可以. 转自:http://blog.csdn.net/deng

Winform中设置ZedGraph鼠标焦点位置画出十字线并在鼠标移出时十字线消失

场景 Winforn中设置ZedGraph曲线图的属性.坐标轴属性.刻度属性: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100112573 在鼠标经过曲线附近时获取最近曲线以及曲线上点的坐标,并以此坐标表示一条十字线. 效果 注: 博客主页:https://blog.csdn.net/badao_liumang_qizhi关注公众号霸道的程序猿获取编程相关电子书.教程推送与免费下载. 实现 绑定鼠标移动事件 zgc.Mo

Winform中设置ZedGraph的曲线为折线、点折线、散点图

场景 Winform中设置ZedGraph的曲线为散点图: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102465399 在上面设置单条曲线为散点图后的思路,继续扩展设置曲线为折线.点折图.散点图. 效果 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 读取配置文件内容获取设置的曲线样式后 Lin