I recently had a similar utility, and in the end I wrote something like the code below:
Write your own class of cells and columns and redefine the EditType and InitializeEditingControl control methods in the cell to return the various controls accordingly (here I just bind the data to the list of the user class with a .useCombo field indicating which control to use):
// Define a column that will create an appropriate type of edit control as needed. public class OptionalDropdownColumn : DataGridViewColumn { public OptionalDropdownColumn() : base(new PropertyCell()) { } public override DataGridViewCell CellTemplate { get { return base.CellTemplate; } set { // Ensure that the cell used for the template is a PropertyCell. if (value != null && !value.GetType().IsAssignableFrom(typeof(PropertyCell))) { throw new InvalidCastException("Must be a PropertyCell"); } base.CellTemplate = value; } } } // And the corresponding Cell type public class OptionalDropdownCell : DataGridViewTextBoxCell { public OptionalDropdownCell() : base() { } public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) { // Set the value of the editing control to the current cell value. base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle); DataItem dataItem = (DataItem) this.OwningRow.DataBoundItem; if (dataItem.useCombo) { DataGridViewComboBoxEditingControl ctl = (DataGridViewComboBoxEditingControl)DataGridView.EditingControl; ctl.DataSource = dataItem.allowedItems; ctl.DropDownStyle = ComboBoxStyle.DropDownList; } else { DataGridViewTextBoxEditingControl ctl = (DataGridViewTextBoxEditingControl)DataGridView.EditingControl; ctl.Text = this.Value.ToString(); } } public override Type EditType { get { DataItem dataItem = (DataItem)this.OwningRow.DataBoundItem; if (dataItem.useCombo) { return typeof(DataGridViewComboBoxEditingControl); } else { return typeof(DataGridViewTextBoxEditingControl); } } } }
Then just add a column to your DataGridView of this type, and you need to use the correct edit control.
Brian
source share