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

故作如下处理:

一  DataGridViewComboBoxCell

重写 DataGridViewComboBox 的单元控件 DataGridViewComboBoxCell

 /// <summary>
/// 自定义可编辑下拉框单元
/// </summary>
public class DataGridViewComboEditBoxCell : DataGridViewComboBoxCell
{
public override void InitializeEditingControl(int rowIndex, object initialFormattedValue,
DataGridViewCellStyle dataGridViewCellStyle)
{
base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle); ComboBox comboBox = (ComboBox)base.DataGridView.EditingControl;
if (comboBox != null)
{
comboBox.DropDownStyle = ComboBoxStyle.DropDown;
comboBox.AutoCompleteMode = AutoCompleteMode.Suggest;
comboBox.Validating += new CancelEventHandler(comboBox_Validating);
}
} protected override object GetFormattedValue(object value, int rowIndex,
ref DataGridViewCellStyle cellStyle, TypeConverter valueTypeConverter,
TypeConverter formattedValueTypeConverter, DataGridViewDataErrorContexts context)
{
if (value != null && value.ToString().Trim() != string.Empty)
{
if (Items.IndexOf(value) == -1)// 如果下拉框中不存在填入的值,则添加到下拉框中
{
Items.Add(value);
// 添加到该列所有单元所绑定的下拉列表中
DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn)OwningColumn;
col.Items.Add(value);
}
} return base.GetFormattedValue(value, rowIndex, ref cellStyle, valueTypeConverter, formattedValueTypeConverter, context);
} private void comboBox_Validating(object sender, CancelEventArgs e)
{
DataGridViewComboBoxEditingControl cbo = (DataGridViewComboBoxEditingControl)sender;
if (cbo.Text.Trim() == string.Empty)
return; DataGridView grid = cbo.EditingControlDataGridView;
object value = cbo.Text; if (cbo.Items.IndexOf(value) == -1)
{
DataGridViewComboBoxColumn cboCol = (DataGridViewComboBoxColumn)grid.Columns[grid.CurrentCell.ColumnIndex];
// 添加到当前下拉框中以及模版中,避免出现重复项
cbo.Items.Add(value);
cboCol.Items.Add(value);
grid.CurrentCell.Value = value;
}
}
}

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,并设置其单元模版为上面自定义的单元

 public class DataGridViewComboEditBoxColumn : DataGridViewComboBoxColumn
{
public DataGridViewComboEditBoxColumn()
{
DataGridViewComboEditBoxCell obj = new DataGridViewComboEditBoxCell();
this.CellTemplate = obj;
}
}

DataGridViewComboEditBoxColumn

三  应用自定义可编辑的 DataGridViewComboEditBoxColumn

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

注:如果是在同一个项目里添加了一、二的两个类后,需要先编译一下,方可在 DataGridView 的列编辑时看到该自定义 ComboEditBoxColumn。

则可以达到如下效果

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

四  参考资料

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

4、参考 Demo:https://github.com/Memento1990/demo.net/tree/master/cnblog/EditableDataGridViewComboBox

[Winform] DataGridView 中 DataGridViewComboBox 的可编辑的更多相关文章

  1. winform dataGridView中的button点击判断

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { if (e.RowI ...

  2. [Winform] DataGridView 总结(FAQ)

    Q1.  如何使单元格不可编辑? A:设置 ReadOnly 属性,可以设置的对象包括 DataGridViewRow(行).DataGridViewColumn(列).DataGridViewCel ...

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

    近期接手一个winform 项目,虽然之前有.net 的经验,但是对一些控件的用法还不是很熟悉. 这段时间将会记录一些在工作中遇到的坎坷以及对应的解决办法,写出来与大家分享并希望大神提出更好解决方法来 ...

  4. C# DataGridView中指定的单元格不能编辑

    注意:DataGridView控件是从.NET Framework 2.0版本开始追加的. ReadOnly属性的使用 DataGridView内所有的单元格不能编辑 当DataGridView.Re ...

  5. Winform界面中主从表编辑界面的快速处理

    在Winform开发中,我们往往除了常规的单表信息录入外,有时候设计到多个主从表的数据显示.编辑等界面,单表的信息一般就是控件和对象实体一一对应,然后调用API保存即可,主从表就需要另外特殊处理,本随 ...

  6. [工作札记]03: 微软Winform窗体中ListView、DataGridView等控件的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有

    工作中,我们发现了微软.net WinForm的一个Bug,会导致窗体设计器自动生成的代码失效,这个Bug从.net4.5到最新的.net4.7.2都存在,一直没有解决.最初是我在教学工作中发现的,后 ...

  7. winform代码:关联窗体数据更新,删除dataGridview中选中的一行或多行

    一.关联窗体数据更新 关联窗体数据修改时,如果一个为总体数据显示窗体A,另一个为详细修改窗体B,从A进入B,在B中对数据进行修改,然后返回A,这时A窗体的数据需要更新. 我采用最简单的方法,首先保证每 ...

  8. .NET WinForm程序中给DataGridView表头添加下拉列表实现数据过滤

    转:http://www.cnblogs.com/jaxu/archive/2011/08/04/2127365.html 我们见过Excel中的数据过滤功能,可以通过点击表头上的下拉列表来实现数据的 ...

  9. C# winform单元格的formatted值的类型错误 DataGridView中CheckBox列运行时候System.FormatException异常

    在DataGridView手动添加了CheckBox列;在窗体Show的时候,遇到一个错误:错误如下: DataGridView中发生一下异常:System.FormatException:单元格的F ...

随机推荐

  1. MCDownloadManager ios文件下载管理器

    我们用AFNetworking小试牛刀,写一个简单的下载器来演示功能. 前言 为什么AFNetworking能够成为顶级框架?我们究竟该如何领悟它的精髓所在?这都是很难的问题.安全,高效,流畅,这3个 ...

  2. Oracle手边常用70则脚本知识汇总

    Oracle手边常用70则脚本知识汇总 作者:白宁超 时间:2016年3月4日13:58:36 摘要: 日常使用oracle数据库过程中,常用脚本命令莫不是用户和密码.表空间.多表联合.执行语句等常规 ...

  3. 【HanLP】资料链接汇总

    Java中调用HanLP配置 HanLP自然语言处理包开源官方文档 了解HanLP的全部 自然语言处理HanLP 开源自由的汉语言处理包主页 GitHub源码 基于hanLP的中文分词详解-MapRe ...

  4. 文档对象模型DOM通俗讲解

    转自:http://www.jb51.net/article/42671.htm 在开始之前先说一点,DOM是非常容易理解的,但是大家说的太官方,让人很是难于理解,我们就用非常简单的语言翻译一遍.加深 ...

  5. vue.js几行实现的简单的todo list

    序:目前前端框架如:vue.react.angular,构建工具fis3.gulp.webpack等等...... 可谓是五花八门,层出不穷,眼花缭乱...其实吧只要你想玩还是可以玩玩的..下面是看了 ...

  6. 排序算法----基数排序(RadixSort(L))单链表智能版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  7. About me

    stay hungry, stay foolish VaJoy / 蓝邦珏 Addr:Tencent Shenzhen E-Mail:vajoy@qq.com 站内:http://space.cnbl ...

  8. DoraCMS 源码知识点备注

    项目需要研究了下DoraCMS这款开源CMS,真心做的不错:).用的框架是常用的express 4 + mongoose,代码也很规范,值得学习. 源码中一些涉及到的小知识点备注下: https:// ...

  9. .NET程序的性能要领和优化建议

    前几天在老赵的博客上看到,Bill Chiles (Roslyn 编译器的Program Manager)写了一篇文章叫做<Essential Performance Facts and .NE ...

  10. TODO:Go语言同名Go字体发布

    TODO:Go语言同名Go字体发布 2016-11-16 Go语言官方博客发布了一款同名字体–Go字体.此字体族包括正常.粗体和斜体渲染,支持比例和等宽字体.此字体已经经过用于编程方面的技术测试,使用 ...