Привет всем, кто занимается программированием 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
-
Проблемы Безопасности Доски Объявлений
19 Oct, 24 -
Hyper-V Или Kvm?
19 Oct, 24 -
Деврел За Копейки
19 Oct, 24 -
Podthings, Выпуск 24
19 Oct, 24 -
Почему Я Ненавижу Фреймворки
19 Oct, 24