3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
|
|
1 | |
Combobox vs. DataTable28.09.2017, 10:42. Показов 1288. Ответов 12
Метки нет (Все метки)
Добрый день!
Требуется совет профессионалов новичку . Во время инициализации подключения к БД в DataSet подгружаются данные таблиц-справочников из БД. Есть несколько комбо-боксов, которые используют эти справочники. Проблема в том, что роль у комбо-боксов разная - где-то используются "чистые" значения, где-то добавляется строка "0 (valueMember), Все(displayMember)" для сброса фильтра. Выходов из ситуации вижу два: 1. Дублировать в датасете таблицы-справочники (одна таблица как в БД, вторая с доп. строкой). Наверно, это способ не очень хорош по причине этого самого дублирования. 2. Осуществлять привязку к комбо-боксам не DataTable, а построчно обрабатывать и добавлять данные в комбо-бокс. Только не очень самому понятно как это лучше сделать. В общем, вопрос, если кто-то озадачивался нечто подобным: как лучше выйти из этой ситуации, как проработать вариант 2, либо может есть еще какие-то альтернативы?
0
|
28.09.2017, 10:42 | |
Ответы с готовыми решениями:
12
DataTable textbox combobox Выборка в DataTable с использованием comboBox Запрос к связанным таблицам (Access), через Datatable с выводом в два Combobox Загрузка элементов из datatable в combobox |
784 / 615 / 273
Регистрация: 04.08.2015
Сообщений: 1,707
|
||||||
28.09.2017, 14:13 | 2 | |||||
wrq2017, установите у комбобокса
0
|
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
|
|
28.09.2017, 14:27 [ТС] | 3 |
0
|
3462 / 2473 / 695
Регистрация: 02.08.2011
Сообщений: 6,704
|
|
28.09.2017, 15:04 | 4 |
Я вот не понял, какие конкретно сложности это вызывает? Вы не можете понять как установить дефолтное значение комбобоксам, или что именно?
0
|
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
|
|
28.09.2017, 15:54 [ТС] | 5 |
Давайте на примере. Есть таблица в БД, данные из которой загружаются в DataTable общего DataSet. Например, таблица-справочник "Типы плана", в которой два столбца "Код" и "Наименование".
Значения такие: 1 - Факт 2 - Бизнес-план 3 - Актуализированный план 4 - Рабочий план (далее на усмотрение пользователя) Данные этой таблицы должны использоваться по-разному. Один раз в комбо-боксе, который является DataGridViewComboBoxCell, собственно в самой основной таблице отражающей данные с возможностью их изменения непосредственно в гриде переключением комбо-бокса. Соответственно, пользователь должен видеть в гриде ячейку с комбо-боксом только указанных значений. С другой стороны, в другом Гриде, который выступает набором фильтров, пользователь должен видеть ячейку с комбо-боксом со значениями: 0 - Все 1 - Факт 2 - Бизнес-план 3 - Актуализированный план 4 - Рабочий план Подключение данных к комбо-боксам (DataGridViewComboBoxCell) происходит через соответствующие DataTable DataSet'a. Но в действующем коде, получается приходится задваивать таблицы с одними и теми же данными, отличающимися лишь первой строкой. Вопрос - как оптимизировать хранение данных? Т.е. не дублировать в ДатаСете одни и те же таблицы.
0
|
3462 / 2473 / 695
Регистрация: 02.08.2011
Сообщений: 6,704
|
||||||
28.09.2017, 16:13 | 6 | |||||
Сообщение было отмечено wrq2017 как решение
Решение
Дублировать ничего и не надо:
Можно определить класс, скажем ComboBoxItem, и метод, скажем, GetDataSource:
SelectedIndex =0 ;По сути, мы просто придумали свой convention (про ValueMember =0). Добавлено через 3 минуты Метод можно куда-нибудь в хелперы вынести, или в более подходящее место - все зависит от структуры вашего проекта. Но это будет в UI, поскольку возимся мы ведь с UI-элементами.
1
|
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
|
|
28.09.2017, 16:19 [ТС] | 7 |
Отлично! Спасибо, это, наверно, то, что мне и надо Только предстоит это всё переварить и осмыслить.
Можно чуть-чуть подробнее: Что значит Select в данном выражении? И вся конструкция в круглых скобках? Добавлено через 43 секунды Что такое хелперы?
0
|
3462 / 2473 / 695
Регистрация: 02.08.2011
Сообщений: 6,704
|
||||||
28.09.2017, 16:25 | 8 | |||||
Select - это проецирование данных, то бишь на каждый элемент DataRow создается свой ComboBoxItem.
Вам там нужно написать что то типа:
Это просто методы, которые помогают что-то делать в различных частях проекта, что-то типа cross-cutting concerns. Как бы название говорит само за себя.
1
|
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
|
|
28.09.2017, 16:30 [ТС] | 9 |
И судя по названию IList - это интерфейс. Надо теперь добавить этот интерфейс соответствующим объектам (правильно ли я выразился)?
0
|
3462 / 2473 / 695
Регистрация: 02.08.2011
Сообщений: 6,704
|
|
28.09.2017, 16:34 | 10 |
Нет, ничего не надо делать.
Коллекция на выходе кастится в List, который уже реализует IList. Это просто для удобства. Вы можете вместо IList вернуть массив и т.д. Только нужно поменять сигнатуру метода.
0
|
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
|
|
28.09.2017, 16:43 [ТС] | 11 |
И такой list типа коллекции ComboBoxItem может служить источником данных для комбо-бокса? И более общий вопрос - любая коллекция может служить источником данных для комбо-бокса? Или единственным условием является наличие полей ValueMember и DisplayMember? Или их все равно можно переопределить, т.е. разницы нет?
Короче, у меня (о)сознание сейчас, прям, метра на два расширилось.
0
|
3462 / 2473 / 695
Регистрация: 02.08.2011
Сообщений: 6,704
|
|
28.09.2017, 16:54 | 12 |
Да.
wrq2017, почитайте документацию. ValueMember и DisplayMember - это просто свойства ComboBox-а и похожих контролов (ListBox, вроде бы), где указываются имена свойств объектов, которые находятся в коллекции. ValueMember - свойство, которое будет хранится внутри элемента ComboBox-a, которое можете использовать для своей логики. DisplayMember - свойство, которое надо показать пользователю.
1
|
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
|
||||||
29.09.2017, 09:31 [ТС] | 13 | |||||
У меня что-то не так с этим кодом. Работаю в Visual Studio 2010, пространство имен System.Linq (оно ведь имеется ввиду?) подключено.
Но выражение ...OfType<DataRow>... вызывает ошибку "... является "метод", который недопустим в данном контексте". Ключевое слово Select не подсвечивается. Что не так? Добавлено через 15 минут Всё! Поправил. Спасибо за ваши ответы, полный код таков:
0
|
29.09.2017, 09:31 | |
29.09.2017, 09:31 | |
Помогаю со студенческими работами здесь
13
Фильтр данных в ComboBox + DataTable Как реализовать привязку ComboBox к DataTable? Два combobox от одного datatable с Select Два ComboBox`a, которые используют один DataTable Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |