Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
wrq2017
2 / 2 / 2
Регистрация: 30.07.2017
Сообщений: 193
1

Combobox vs. DataTable

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

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

В общем, вопрос, если кто-то озадачивался нечто подобным: как лучше выйти из этой ситуации, как проработать вариант 2, либо может есть еще какие-то альтернативы?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2017, 10:42
Ответы с готовыми решениями:

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

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

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

Как из одного datatable перенести столбец в другой datatable?
Здравствуйте! Кто может подсказать: как из одного datatable перенести столбец в другой datatable?

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

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

Подключение данных к комбо-боксам (DataGridViewComboBoxCell) происходит через соответствующие DataTable DataSet'a.
Но в действующем коде, получается приходится задваивать таблицы с одними и теми же данными, отличающимися лишь первой строкой.
Вопрос - как оптимизировать хранение данных? Т.е. не дублировать в ДатаСете одни и те же таблицы.
0
IamRain
1409 / 1255 / 396
Регистрация: 02.08.2011
Сообщений: 3,727
28.09.2017, 16:13 6
Лучший ответ Сообщение было отмечено 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
wrq2017
2 / 2 / 2
Регистрация: 30.07.2017
Сообщений: 193
28.09.2017, 16:19  [ТС] 7
Отлично! Спасибо, это, наверно, то, что мне и надо Только предстоит это всё переварить и осмыслить.
Можно чуть-чуть подробнее:

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

Добавлено через 43 секунды
Цитата Сообщение от IamRain Посмотреть сообщение
Метод можно куда-нибудь в хелперы
Что такое хелперы?
0
IamRain
1409 / 1255 / 396
Регистрация: 02.08.2011
Сообщений: 3,727
28.09.2017, 16:25 8
Цитата Сообщение от 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
wrq2017
2 / 2 / 2
Регистрация: 30.07.2017
Сообщений: 193
28.09.2017, 16:30  [ТС] 9
И судя по названию IList - это интерфейс. Надо теперь добавить этот интерфейс соответствующим объектам (правильно ли я выразился)?
0
IamRain
1409 / 1255 / 396
Регистрация: 02.08.2011
Сообщений: 3,727
28.09.2017, 16:34 10
Нет, ничего не надо делать.
Цитата Сообщение от IamRain Посмотреть сообщение
ToList();
Коллекция на выходе кастится в List, который уже реализует IList. Это просто для удобства. Вы можете вместо IList вернуть массив и т.д. Только нужно поменять сигнатуру метода.
0
wrq2017
2 / 2 / 2
Регистрация: 30.07.2017
Сообщений: 193
28.09.2017, 16:43  [ТС] 11
И такой list типа коллекции ComboBoxItem может служить источником данных для комбо-бокса? И более общий вопрос - любая коллекция может служить источником данных для комбо-бокса? Или единственным условием является наличие полей ValueMember и DisplayMember? Или их все равно можно переопределить, т.е. разницы нет?
Короче, у меня (о)сознание сейчас, прям, метра на два расширилось.
0
IamRain
1409 / 1255 / 396
Регистрация: 02.08.2011
Сообщений: 3,727
28.09.2017, 16:54 12
Цитата Сообщение от wrq2017 Посмотреть сообщение
И более общий вопрос - любая коллекция может служить источником данных для комбо-бокса?
Да.

wrq2017, почитайте документацию.
ValueMember и DisplayMember - это просто свойства ComboBox-а и похожих контролов (ListBox, вроде бы), где указываются имена свойств объектов, которые находятся в коллекции.
ValueMember - свойство, которое будет хранится внутри элемента ComboBox-a, которое можете использовать для своей логики. DisplayMember - свойство, которое надо показать пользователю.
1
wrq2017
2 / 2 / 2
Регистрация: 30.07.2017
Сообщений: 193
29.09.2017, 09:31  [ТС] 13
Цитата Сообщение от 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
29.09.2017, 09:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2017, 09:31

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

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

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru