Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223

Combobox vs. DataTable

28.09.2017, 10:42. Показов 1458. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Требуется совет профессионалов новичку .
Во время инициализации подключения к БД в DataSet подгружаются данные таблиц-справочников из БД.
Есть несколько комбо-боксов, которые используют эти справочники. Проблема в том, что роль у комбо-боксов разная - где-то используются "чистые" значения, где-то добавляется строка "0 (valueMember), Все(displayMember)" для сброса фильтра.
Выходов из ситуации вижу два:
1. Дублировать в датасете таблицы-справочники (одна таблица как в БД, вторая с доп. строкой). Наверно, это способ не очень хорош по причине этого самого дублирования.
2. Осуществлять привязку к комбо-боксам не DataTable, а построчно обрабатывать и добавлять данные в комбо-бокс. Только не очень самому понятно как это лучше сделать.

В общем, вопрос, если кто-то озадачивался нечто подобным: как лучше выйти из этой ситуации, как проработать вариант 2, либо может есть еще какие-то альтернативы?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.09.2017, 10:42
Ответы с готовыми решениями:

DataTable textbox combobox
Есть кобмобокс который привязан к dataset есть несколько текстбоксов, есть несколько кнопок очистить все поля, создать. Возникла проблема...

Выборка в DataTable с использованием comboBox
Здравствуйте! Помогите пожалуйста с функцией Select. Есть код: private void SortBox_SelectedIndexChanged(object sender, EventArgs e) ...

Запрос к связанным таблицам (Access), через Datatable с выводом в два Combobox
Всем доброго. Помогите кто с проблемкой, есть две связанные таблицы Statiy ID-ключ Name - string Statiy ID-integer Name -...

12
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
28.09.2017, 14:13
wrq2017, установите у комбобокса
C#
1
 comboBox1.SelectedIndex = -1;
и это будет равнозначно обнулению фильтра.
0
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
28.09.2017, 14:27  [ТС]
Цитата Сообщение от Igr_ok Посмотреть сообщение
и это будет равнозначно обнулению фильтра.
Эммм... А как пользователь сможет это сделать?
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
28.09.2017, 15:04
Цитата Сообщение от wrq2017 Посмотреть сообщение
Проблема в том, что роль у комбо-боксов разная - где-то используются "чистые" значения, где-то добавляется строка "0 (valueMember), Все(displayMember)" для сброса фильтра.
Я вот не понял, какие конкретно сложности это вызывает? Вы не можете понять как установить дефолтное значение комбобоксам, или что именно?
0
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
28.09.2017, 15:54  [ТС]
Цитата Сообщение от IamRain Посмотреть сообщение
Я вот не понял, какие конкретно сложности это вызывает? Вы не можете понять как установить дефолтное значение комбобоксам, или что именно?
Давайте на примере. Есть таблица в БД, данные из которой загружаются в DataTable общего DataSet. Например, таблица-справочник "Типы плана", в которой два столбца "Код" и "Наименование".
Значения такие:
1 - Факт
2 - Бизнес-план
3 - Актуализированный план
4 - Рабочий план
(далее на усмотрение пользователя)
Данные этой таблицы должны использоваться по-разному. Один раз в комбо-боксе, который является DataGridViewComboBoxCell, собственно в самой основной таблице отражающей данные с возможностью их изменения непосредственно в гриде переключением комбо-бокса. Соответственно, пользователь должен видеть в гриде ячейку с комбо-боксом только указанных значений.
С другой стороны, в другом Гриде, который выступает набором фильтров, пользователь должен видеть ячейку с комбо-боксом со значениями:
0 - Все
1 - Факт
2 - Бизнес-план
3 - Актуализированный план
4 - Рабочий план

Подключение данных к комбо-боксам (DataGridViewComboBoxCell) происходит через соответствующие DataTable DataSet'a.
Но в действующем коде, получается приходится задваивать таблицы с одними и теми же данными, отличающимися лишь первой строкой.
Вопрос - как оптимизировать хранение данных? Т.е. не дублировать в ДатаСете одни и те же таблицы.
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
28.09.2017, 16:13
Лучший ответ Сообщение было отмечено wrq2017 как решение

Решение

Цитата Сообщение от wrq2017 Посмотреть сообщение
Вопрос - как оптимизировать хранение данных? Т.е. не дублировать в ДатаСете одни и те же таблицы.
Дублировать ничего и не надо:
Можно определить класс, скажем ComboBoxItem, и метод, скажем, GetDataSource:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class ComboBoxItem 
{
     int ValueMember {get;set;}
     string DisplayMember {get;set;}
} 
 
 
// примерно  так
public static IList<ComboBoxItem> GetDataSource(DataTable table, string noFilterDisplayValue = null)
{
    List<ComboBoxItem> list=  table.Rows.OfType<>.Select(row => new CombBoxItem(){...}).ToList();
    if (noFilterDisplayValue != null)
                   list.Add(new ComboBoxItem {ValueMember = 0, DisplayMember = noFilterDisplayValue});   
    return list;
}
Соответственно в тех комбобоксах в которых критично установить правильный дефолтный элемент, ищете у кого ValueMember =0, у остальных просто SelectedIndex =0;
По сути, мы просто придумали свой convention (про ValueMember =0).

Добавлено через 3 минуты
Метод можно куда-нибудь в хелперы вынести, или в более подходящее место - все зависит от структуры вашего проекта. Но это будет в UI, поскольку возимся мы ведь с UI-элементами.
1
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
28.09.2017, 16:19  [ТС]
Отлично! Спасибо, это, наверно, то, что мне и надо Только предстоит это всё переварить и осмыслить.
Можно чуть-чуть подробнее:

Цитата Сообщение от IamRain Посмотреть сообщение
List<ComboBoxItem> list= *table.Rows.OfType<>.Select(row => new CombBoxItem(){...}).ToList();
Что значит Select в данном выражении? И вся конструкция в круглых скобках?

Добавлено через 43 секунды
Цитата Сообщение от IamRain Посмотреть сообщение
Метод можно куда-нибудь в хелперы
Что такое хелперы?
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
28.09.2017, 16:25
Цитата Сообщение от wrq2017 Посмотреть сообщение
Что значит Select в данном выражении? И вся конструкция в круглых скобках?
Select - это проецирование данных, то бишь на каждый элемент DataRow создается свой ComboBoxItem.
Вам там нужно написать что то типа:
C#
1
2
3
4
int seedValue = 1;
List<ComboBoxItem> list= table.Rows.OfType<DataRow>.Select(row => 
new CombBoxItem(){ ValueMember = row.GetInt32(0),
                                 DisplayMember = row.GetString(1)}).ToList();
Вообщем нужно вытащить данные из объекта DataRow.

Цитата Сообщение от wrq2017 Посмотреть сообщение
Что такое хелперы?
Это просто методы, которые помогают что-то делать в различных частях проекта, что-то типа cross-cutting concerns. Как бы название говорит само за себя.
1
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
28.09.2017, 16:30  [ТС]
И судя по названию IList - это интерфейс. Надо теперь добавить этот интерфейс соответствующим объектам (правильно ли я выразился)?
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
28.09.2017, 16:34
Нет, ничего не надо делать.
Цитата Сообщение от IamRain Посмотреть сообщение
ToList();
Коллекция на выходе кастится в List, который уже реализует IList. Это просто для удобства. Вы можете вместо IList вернуть массив и т.д. Только нужно поменять сигнатуру метода.
0
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
28.09.2017, 16:43  [ТС]
И такой list типа коллекции ComboBoxItem может служить источником данных для комбо-бокса? И более общий вопрос - любая коллекция может служить источником данных для комбо-бокса? Или единственным условием является наличие полей ValueMember и DisplayMember? Или их все равно можно переопределить, т.е. разницы нет?
Короче, у меня (о)сознание сейчас, прям, метра на два расширилось.
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
28.09.2017, 16:54
Цитата Сообщение от wrq2017 Посмотреть сообщение
И более общий вопрос - любая коллекция может служить источником данных для комбо-бокса?
Да.

wrq2017, почитайте документацию.
ValueMember и DisplayMember - это просто свойства ComboBox-а и похожих контролов (ListBox, вроде бы), где указываются имена свойств объектов, которые находятся в коллекции.
ValueMember - свойство, которое будет хранится внутри элемента ComboBox-a, которое можете использовать для своей логики. DisplayMember - свойство, которое надо показать пользователю.
1
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
29.09.2017, 09:31  [ТС]
Цитата Сообщение от IamRain Посмотреть сообщение
C#
1
2
List<ComboBoxItem> list= table.Rows.OfType<DataRow>.Select(row => 
new CombBoxItem(){ ValueMember = row.GetInt32(0), DisplayMember = row.GetString(1)}).ToList();
У меня что-то не так с этим кодом. Работаю в Visual Studio 2010, пространство имен System.Linq (оно ведь имеется ввиду?) подключено.
Но выражение ...OfType<DataRow>... вызывает ошибку "... является "метод", который недопустим в данном контексте".
Ключевое слово Select не подсвечивается. Что не так?

Добавлено через 15 минут
Всё! Поправил. Спасибо за ваши ответы, полный код таков:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class ComboBoxItem 
{
     public int ValueMember {get;set;}
     public string DisplayMember {get;set;}
} 
 
public static IList<ComboBoxItem> GetDataSource(DataTable table, string noFilterDisplayValue = null)
{
    List<ComboBoxItem> list= table.Rows.OfType<DataRow>().Select(row => 
new CombBoxItem(){ ValueMember = row.GetInt32(0), DisplayMember = row.GetString(1)}).ToList();
 
    if (noFilterDisplayValue != null)
                   list.Add(new ComboBoxItem {ValueMember = 0, DisplayMember = noFilterDisplayValue});   
    return list;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.09.2017, 09:31
Помогаю со студенческими работами здесь

Загрузка элементов из datatable в combobox
Доброго времени суток! Суть задачи состоит в том, чтобы в combobox заносилась фамилия врача с соответствующей специальностью. Список...

Фильтр данных в ComboBox + DataTable
Дано: 2 Combobox, 1 DataTable. DataTable является источником данных для Combobox. DataTable состоит из трех столбцов: Имя,...

Как реализовать привязку ComboBox к DataTable?
Здраствуйте. Реализован autocomplete combobox следующим образом OleDbDataAdapter da_auto; OleDbConnection connection =...

Два combobox от одного datatable с Select
Добрый день, на форме имеется два комбобокса, которые должны работать с одной таблицей. В первом комбобоксе все значения одной колонки...

Два ComboBox`a, которые используют один DataTable
Доброе утро. Подскажите, пожалуйста, как решить проблему: есть два ComboBox`a которые используют один дататейбл ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru