Вредоносное «Неверное Значение Datagridviewcomboboxcell» В Vb.net И С#

Привет всем, кто занимается программированием Windows для MS VS.



Проблема

1. Есть DataGridView, один из столбцов — DataGridViewComboBoxColumn; 2. Данные добавляются в сетку через DataSource, например DataTable (а не построчно, это важно); 3. Данные в ComboBoxColumn также привязаны, источник данных имеет заполненный DataMember, построчно или нет - не важно, конкретная структура данных тоже не важна, ValueMember в нем Integer, Long или даже Нить.

При выборе чего-либо из выпадающего списка dgv_DataError ловит ошибку: «Недопустимое значение DataGridViewComboBoxCell».

А по начинке – ее.



Поиск

Гугл вернул только две с половиной страницы форумов.

Это означает, что проблема широко распространена, но не может быть решена на среднем уровне.

Неправильные направления развития мысли: а) После привязки данных пройдитесь по каждой строке и вручную переназначьте значение в ячейке, найдя его в списке.

б) Завершить обработку dgv_DataError. В то же время при ручном заполнении строк таблицы через Rows.Add() все в порядке.

Мои несчастные коллеги пытались разобраться, что не так со списком, но проблема оказалась не в нем, а именно в несовпадении типов.

Исторически сложилось так, что MS SQL использует десятичное число для столбца с включенной идентификацией.

Да, это десятичный формат (18,0), но это по-прежнему дробный тип данных.

Согласен, всегда удобно видеть десятичный знак индекса.

Если я ожидаю до миллиона записей в год, то десятичное число (7,0) будет длиться 10 лет, а десятичное (10,0) — 10 000. Допустим, Солнце взорвется через 5 миллиардов лет — посчитаем цифры: 6+9, то есть десятичной дроби (15,0), вполне достаточно, не говоря уже о стандартных 18 — с запасом.

И в списке у нас есть Integer, Long или даже String! Если мы заполним строки ручками, то железный болван будет неявно пересчитывать за нас все дробное и недробное.

Медленный и надежный.

И нам хочется быстро, но экономия достигается еще и за счет отсутствия ненужных проверок типов и преобразований.

В результате мы получаем две проблемы: 1. При загрузке данных в таблицу вместо названий заголовков из списка в столбце отображаются имена ID из базы данных.

2. При выборе имени заголовка из раскрывающегося списка значение в ячейке не обновляется.



Решение

Если база данных очень, очень большая, старая или недоступна разработчику интерфейса, используйте десятичные индексы в поле со списком.

Если структуру таблиц в базе данных изменить проще, то использование bigint для внешних ключей хорошо, он больше десятичного (18.0) почти на целый бит и быстрее.

Теги: #C++ #.

NET #Microsoft SQL Server #DataGridView #DataGridViewComboBoxCell

Вместе с данным постом часто просматривают: