[Winform] DataGridView中DataGridViewComboBox的可编辑

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

image

故作如下处理:

一  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控件,如下图:

image

则可以达到如下效果

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

四  参考资料

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

你可能感兴趣的:(datagridview)