Редактируемый столбец DataGridViewComboBox, привязанный к источнику данных, или как обрабатывать событие CellValidating C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Редактируемый столбец DataGridViewComboBox, привязанный к источнику данных, или как обрабатывать событие CellValidating

Сообщение Anonymous »

У меня есть столбец со списком в DataGridView, привязанный к источнику данных для выбора элемента из подтаблицы, и я хочу, чтобы поле со списком было редактируемым (поле со списком со стилем ComboBoxStyle.DropDown). Моей первой идеей было создать такой столбец:

Код: Выделить всё

    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";
}
Это работает, но когда я вручную ввожу что-то в поле со списком, оно отбрасывается, и значение возвращается к исходному значению. Затем я попытался переопределить ParseFormattedValue в пользовательском столбце, но он даже не вызывается, вероятно, из-за некоторой предварительной проверки.
Я нашел где-то здесь аналогичный вопрос и сумел заставить его работать, но без пользовательский столбец и с обработкой событий 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;
}
}
Это работает, но у меня вопрос: можно ли обрабатывать CellValidating в области настраиваемого столбца? Мне не нравится это решение, потому что оно не является независимым: во-первых, мне нужно добавить эти два обработчика для каждого DataGridView, в котором мне нужна эта функциональность, а во-вторых, мне нужно жестко закодировать типы подэлементов, имена столбцов и т. д. в этом обработчике. Если бы я мог сделать это непосредственно в настраиваемом столбце, он был бы независимым, и я мог бы просто добавить настраиваемый столбец в DataGridView и все.


Подробнее здесь: https://stackoverflow.com/questions/793 ... andle-cell
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Редактируемый столбец DataGridViewComboBox, привязанный к источнику данных, или как обрабатывать событие CellValidating
    Anonymous » » в форуме C#
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Редактируемый столбец DataGridViewComboBox, привязанный к источнику данных, или как обрабатывать событие CellValidating
    Anonymous » » в форуме C#
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Заполняется только один столбец DataGridViewComboBox
    Anonymous » » в форуме C#
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Редактируемый столбец не работает в Kartik Expand Row Grid
    Anonymous » » в форуме Php
    0 Ответы
    42 Просмотры
    Последнее сообщение Anonymous
  • C# подключиться к источнику данных System ODBC
    Anonymous » » в форуме C#
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»