Русский
Русский
English
Статистика
Реклама

Зловредное Недопустимое значение DataGridViewComboBoxCell в vb.net и c

Привет всем, программирующим окошки под MS VS.

Проблема


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

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

Поиски


Гугл выдал всего две с половиной страницы форумов. Значит, проблема распространена, но на среднем уровне не решается. Неверные направления развития мысли:
а) После привязывания данных пройтись по каждой строке и ручками переназначить значение в ячейке, найдя его в списке.
б) Повесить обработку dgv_DataError.

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

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

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

А в списке-то у нас Integer, Long или даже String!

Заполняй мы строки ручками, железный болван за нас неявно все дробное и недробное преобразует. Медленно и надежно. А мы хотим быстро, но экономия достигается в том числе и на отсутствии лишних проверок типов и преобразований.

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

Решение


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

Если проще поменять структуру таблиц в базе, то использовать для внешних ключей bigint благо, он больше decimal (18,0) почти на целый разряд и быстрее.
Источник: habr.com
К списку статей
Опубликовано: 23.12.2020 10:20:51
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Net

Microsoft sql server

C

Datagridview

Datagridviewcomboboxcell

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru