Код: Выделить всё
public class DgvEditableComboBoxCell : DataGridViewComboBoxCell
{
public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
var comboBox = DataGridView.EditingControl as ComboBox;
if (comboBox != null)
{
comboBox.DropDownStyle = ComboBoxStyle.DropDown;
}
}
}
public class DgvEditableComboBoxColumn : DataGridViewComboBoxColumn
{
public DgvEditableComboBoxColumn()
{
CellTemplate = new DgvEditableComboBoxCell();
}
}
Код: Выделить всё
private void MainForm_Load(object sender, EventArgs e)
{
dgv.AutoGenerateColumns = false;
dc = new DbDataContext();
var col = dgv.Columns["colProjID"] as DataGridViewComboBoxColumn;
col.DataSource = dc.Proj2s.OrderBy(o => o.Code);
col.DisplayMember = "Code";
col.ValueMember = "ID";
}
Я нашел где-то здесь аналогичный вопрос и сумел заставить его работать, но без пользовательский столбец и с обработкой событий DataGridView следующим образом:
Код: Выделить всё
private void dgv_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (e.Control.GetType() == typeof(DataGridViewComboBoxEditingControl))
{
DataGridViewComboBoxEditingControl combo = e.Control as DataGridViewComboBoxEditingControl;
combo.DropDownStyle = ComboBoxStyle.DropDown;
}
}
private void dgv_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
var cell = dgv.CurrentCell as DataGridViewComboBoxCell;
if ((cell != null) && (cell.OwningColumn.Name == "colProjID"))
{
string code = e.FormattedValue.ToString();
var obj = cell.Items.Cast().SingleOrDefault(o => o.Code == code);
if (obj != null)
cell.Value = obj.ID;
}
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... andle-cell