重载实现DataGridViewComboBoxColumn的可编辑功能(转贴)

  真正的DataGridViewComboBoxColumn .NetFramework 2.0里提供的DataGridViewComboBoxColumn 只有在以下情况下才正常工作:它的所有单元格值(由 DataGridView.DataSource 属性填充)与选择的范围(由 DataSource 属性或 Items 属性填充)之间存在映射。如果此映射不存在,则当该列位于视图中时,会出现消息“进行格式设置时出现错误,显示”。因此,这个ComboBox无法进行自由编辑,我写了个扩展的 DataGridViewComboEditBoxColumn 类实现了ComboBoxStyle.DropDown的功能,代码的关键点为两处,一是在显示时将ComboBoxColumn以及ComboBox的Items添加入所有可能出现的项,在GetFormattedValue时实现,二是在编辑验证ComboBox数据时即时插入新项,在ComboBox.Validating时实现。 public class DataGridViewComboEditBoxCell : DataGridViewComboBoxCell { public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) { base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle); ComboBox comboBox = base.DataGridView.EditingControl as ComboBox; if (comboBox != null) { comboBox.DropDownStyle = ComboBoxStyle.DropDown; 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) { if (value.ToString().Trim() != string.Empty) { if (Items.IndexOf(value) == -1) { Items.Add(value); DataGridViewComboBoxColumn col = OwningColumn as DataGridViewComboBoxColumn; col.Items.Add(value); } } } return base.GetFormattedValue(value, rowIndex, ref cellStyle, valueTypeConverter, formattedValueTypeConverter, context); } void comboBox_Validating(object sender, System.ComponentModel.CancelEventArgs e) { DataGridViewComboBoxEditingControl cbo = sender as DataGridViewComboBoxEditingControl; if (cbo.Text.Trim() == string.Empty) return; DataGridView grid = cbo.EditingControlDataGridView; object value = cbo.Text; // Add value to list if not there if (cbo.Items.IndexOf(value) == -1) { DataGridViewComboBoxColumn cboCol = grid.Columns[grid.CurrentCell.ColumnIndex] as DataGridViewComboBoxColumn; // Must add to both the current combobox as well as the template, to avoid duplicate entries cbo.Items.Add(value); cboCol.Items.Add(value); grid.CurrentCell.Value = value; } } } public class DataGridViewComboEditBoxColumn : DataGridViewComboBoxColumn { public DataGridViewComboEditBoxColumn() { DataGridViewComboEditBoxCell obj = new DataGridViewComboEditBoxCell(); this.CellTemplate = obj; } } 以上内容转贴自:http://www.cnblogs.com/dotage/articles/450870.html 愚公点纪的个人博客,在此引用只为以后参考方便,并对愚公点纪表示感谢!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值