Проверьте, пуст ли DataGridViewComboBox.

У меня есть datagridview со столбцом со списком, который привязан к перечислению следующим образом:

     var D = (DataGridViewComboBoxColumn)dgvInputs.Columns[2];
     D.ValueType = typeof(MyType);
     D.ValueMember = "Value";
     D.DisplayMember = "Display";
     D.DataSource = new MyType[] {
        MyType.Rev,
        MyType.Model,
        MyType.User,
        MyType.Status
     }.Select(x => new { Display = x.ToString(), Value = (int)x }).ToList();

Затем datagridview привязывается к DataTable с именем ParameterTable:

     BindingSource ParamSource = new BindingSource();
     ParamSource.DataSource = DataEntry.ParameterTable;
     dgvInputs.AutoGenerateColumns = false;
     dgvInputs.DataSource = ParamSource;
     dgvInputs.Columns[0].DataPropertyName = "Name";
     dgvInputs.Columns[1].DataPropertyName = "Prompt";
     dgvInputs.Columns[2].DataPropertyName = "Type";
     dgvInputs.Columns[3].DataPropertyName = "Width";
     dgvInputs.Columns[4].DataPropertyName = "Default Value";

Когда пользователь закончит редактирование таблицы, мне нужно ее подтвердить. В частности, мне нужно проверить, что тип был определен в каждой строке и что значение по умолчанию совместимо с типом.

Проблема в том, что все тесты, которые я нашел для проверки того, был ли установлен тип, не удались. Когда позже я пытаюсь привести значение как MyType в рамках проверки значения по умолчанию, я получаю сообщение об ошибке. Когда я проверяю свойство .Value в пустой ячейке Type в отладчике, оно показывает значение "{}".

В настоящее время у меня есть этот код для теста в событии Validating для самого datagridview. Я пробовал различные другие версии, и они также потерпели неудачу:

     foreach (DataGridViewRow Row in dgvInputs.Rows) {
        if (!Row.IsNewRow) {
           // test other columns ...

           DataGridViewComboBoxCell Cell = (DataGridViewComboBoxCell)(Row.Cells[2]);
           if (Cell == null || Cell.Value as string == string.Empty) { 
               // Error ...
           }
           MyType PType = (MyType)(Cell.Value);

Как я могу проверить, не была ли установлена ​​ячейка DataGridViewComboBox, и что это за значение «{}»?

К сведению: я использую VS 2008 и .Net 3.5 SP1. Не мой выбор. Только то, что мне доступно.


person Paul Sinclair    schedule 02.12.2015    source источник
comment
Какой тип DataEntry.ParameterTable?   -  person Ivan Stoev    schedule 02.12.2015
comment
Извини. Это таблица данных   -  person Paul Sinclair    schedule 02.12.2015
comment
if (Cell.Value == null) должен указывать, когда ячейка не установлена   -  person Sergii Zhevzhyk    schedule 02.12.2015
comment
Предполагая, что вы заполните источник данных ВСЕМИ значениями перечисления, вы можете сократить его до D.DataSource = Enum.GetValues(typeof(MyType));. Я совершенно уверен, что по умолчанию произойдет следующее: отображение будет .ToString(), а значение, очевидно, будет значением перечисления.   -  person Giora Guttsait    schedule 02.12.2015
comment
@GioraGuttsait - нет. Есть несколько типов только для внутреннего использования. Но я буду иметь это в виду, если решу изменить это позже. Спасибо.   -  person Paul Sinclair    schedule 02.12.2015
comment
@SergiiZhevzhyk - может быть, так и должно быть. Но это не так. Тот, который я пробовал раньше, и только что проверил снова. Несмотря на то, что я даже никогда не входил в ячейку Type, она присваивает ей значение, которое отладчик показывает как {}, а не null.   -  person Paul Sinclair    schedule 02.12.2015
comment
Похоже, вы устанавливаете источник данных с анонимным типом, но для ValueType вы указываете свой тип перечисления. Почему бы просто не дать ему свое перечисление напрямую   -  person BenCamps    schedule 02.12.2015
comment
@bit2know - потому что, если бы я это сделал, я бы получил имена как значения, а затем мне пришлось бы добавить дополнительный код, чтобы вернуть имена к типам.   -  person Paul Sinclair    schedule 03.12.2015


Ответы (1)


Есть пара проблем с этим кодом.

Во-первых, D.ValueType = typeof(MyType); неверно, потому что, насколько я вижу, вы привязываетесь к полю int. Просто удалите эту строку, ValueType будет выведено из источника данных.

Теперь главный вопрос. При привязке к таблице данных не введенное значение представлено DBNull.Value. Я бы посоветовал вам проверить как null, так и DBNull.Value. При вводе тип значения в вашем случае будет int, но вы можете спокойно распаковать его в MyType.

Код должен быть примерно таким

//...
var value = Row.Cells[2].Value;
if (value == null || value == DBNull.Value)
{ 
    // Error ...
}
else
{
    var type = (MyType)value;
    // Check if type contains a valid value ...
}
person Ivan Stoev    schedule 02.12.2015
comment
Это было то, что мне было нужно. Спасибо. Синтаксис D.ValueType = typeof я взял где-то из другого вопроса о том, как связать столбец со списком с перечислением. Я все еще пытаюсь понять, как работают datagridviews. - person Paul Sinclair; 02.12.2015