Модераторы: gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ComboBox и DataSet, несколько столбцов в СВ из DS 
V
    Опции темы
qweasd
Дата 14.4.2009, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 28.10.2006

Репутация: нет
Всего: нет



Здравствуйте!

Сделал так:
Код

MyDataSet = new DataSet();
            MyAdapter = new MySqlDataAdapter("SELECT * FROM invent.fullname", MyConn);
            MyAdapter.Fill(MyDataSet, "fullname");
    
            
            comboBox1.DataSource = MyDataSet.Tables["fullname"];
            comboBox1.ValueMember = "id";
            comboBox1.DisplayMember = "Firstname";
//            foreach (DataRow dr in MyDataSet.Tables["fullname"].Rows)
//            {
//                comboBox1.Items.Add(dr[1].ToString()+" "+dr[2].ToString()+" "+dr[3].ToString());
//            }


Хочу чтобы в ComboBox отображалось значения 3х столбцов из бд НО при этом каждому значению в ComboBox соответствовал его id из БД(не хочется после выбора в ComboBox запросом искать в БД значение id). Как это сделать?
PM MAIL   Вверх
-Mikle-
Дата 14.4.2009, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 1
Всего: 59



Не понял в чем вопрос. Ты же делаешь 
Цитата(qweasd @  14.4.2009,  13:42 Найти цитируемый пост)
            comboBox1.ValueMember = "id";
            comboBox1.DisplayMember = "Firstname";


Код

comboBox1.SelectedItem  - вернет DataRowView
comboBox1.SelectedText  - вернет значение колонки DisplayMember
comboBox1.SelectedValue - вернет значение колонки ValueMember



--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
qweasd
Дата 14.4.2009, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 28.10.2006

Репутация: нет
Всего: нет



Но не отобразит все 3 столбца в ComboBox, а только один "Firstname". А вот это выведет все 3 столбца но без привязки к id: 

Код

//            foreach (DataRow dr in MyDataSet.Tables["fullname"].Rows)
//            {
//                comboBox1.Items.Add(dr[1].ToString()+" "+dr[2].ToString()+" "+dr[3].ToString());
//            }


а я хочу скомбинировать 3 столбца и привязка к id)))
PM MAIL   Вверх
Экскалупатор
Дата 14.4.2009, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 3
Всего: 24



можно попробовать сделать вычисляемый столбец(соеденить в нем значения из трех нужных) и его уже отобразить в ComboBox, он будет привязан по Id. как мне кажется...

Это сообщение отредактировал(а) Экскалупатор - 14.4.2009, 16:29
PM MAIL ICQ   Вверх
-Mikle-
Дата 14.4.2009, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 1
Всего: 59



Цитата(Экскалупатор @  14.4.2009,  19:26 Найти цитируемый пост)
можно попробовать сделать вычисляемый столбец(соеденить в нем значения из трех нужных) и его уже отобразить в ComboBox, он будет привязан по Id. как мне кажется...

Так и надо сделать, либо в SQL запросе сразу.

SQL:
Код

            SELECT col1 + ' ' + col2 + ' ' + col3 FROM table

Вычисляемый столбец:
Код

            DataTable table = MyDataSet.Tables["fullname"];
            table.Columns.Add("fio", typeof(string), "col1 + ' ' + col2 + ' ' + col3");



--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
qweasd
Дата 15.4.2009, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 28.10.2006

Репутация: нет
Всего: нет



Цитата

можно попробовать сделать вычисляемый столбец(соеденить в нем значения из трех нужных) и его уже отобразить в ComboBox, он будет привязан по Id. как мне кажется...
 - это неверно! id может идти не по порядку 1 5 8 9 ....

Цитата

SQL:код SQL
1:
              SELECT col1 + ' ' + col2 + ' ' + col3 FROM table




Вычисляемый столбец:Код

            DataTable table = MyDataSet.Tables["fullname"];
            table.Columns.Add("fio", typeof(string), "col1 + ' ' + col2 + ' ' + col3");
 - это тоже не выход!

Я так понимаю прийдется выбирать, а потом искать соответствующий id (((((((((((((((
Может  в ComboBox можно както скрыть часть введенного текста

Это сообщение отредактировал(а) qweasd - 15.4.2009, 13:19
PM MAIL   Вверх
Idsa
Дата 15.4.2009, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Можно просто переопределить ToString(). Правда, строчки
Код

comboBox1.ValueMember = "id";
            comboBox1.DisplayMember = "Firstname";

нужно убрать: нам нужно, чтобы баиндился сам объект.

А вообще, используйте WPF: там подобные вещи делаются гораздо удобнее.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Экскалупатор
Дата 15.4.2009, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 3
Всего: 24



Цитата

это неверно! id может идти не по порядку 1 5 8 9 ....

не совсем понял что вы имеете ввиду. если вы сделаете вычисляемый столбец в таблице, он будет работать так же как и любой другой столбец этой таблицы(не важно по порядку или нет идет Id), т.е. и по Id сортироваться тоже будет и если вы делаете привязку его по Id то все будет работать так же как и с нормальным столбцом(любым из этой таблицы), просто в этом столбце, будут содержаться объединенные данные из нескольких столбцов. или я вас все таки не правильно понял?

Это сообщение отредактировал(а) Экскалупатор - 15.4.2009, 13:19
PM MAIL ICQ   Вверх
qweasd
Дата 15.4.2009, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 28.10.2006

Репутация: нет
Всего: нет



Что такое "вычисляемый столбец"

Добавлено через 6 секунд
Что такое "вычисляемый столбец"?

Добавлено через 10 секунд
Что такое "вычисляемый столбец"?
PM MAIL   Вверх
Idsa
Дата 15.4.2009, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



qweasd, вычисляемые столбцы - не лучшее решение. Запросы в базу в общем случае не должны зависеть от слоя представления. Если у Вас есть таблица invent.fullname, и есть запрос, который возвращает значения из нее, нужно воспользоваться именно им (ну или создать отдельный, который возвращает меньшее количество атрибутов), но не нужно создавать запросы в угоду отображению: это сделает DAL уродливым и неудобным. Если Вам не хватает возможностей отображения WinForms, переходите на WPF. Если нет желания переходить на WPF, считывайте значения в какой-нибудь класс с переопределенным ToString (в WinForms ComboBox отображает ToString() забаинденного объекта).


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
qweasd
Дата 15.4.2009, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 28.10.2006

Репутация: нет
Всего: нет



С помощью WPF - возможна такая реализация?
PM MAIL   Вверх
Экскалупатор
Дата 15.4.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 3
Всего: 24



qweasd, если вам к примеру нужно отобразить значения из нескольких столбцов, и работать с этими значениями как с одним столбцом, то вы создаете запрос к базе(ну или прямо в DataSet) и создаете как бы виртуальный столбец, в котором содержаться нужные вам данные, и работаете уже с ними(это делается для того что бы не выбирать по очереди нужные данные, а сразу получить объединенные данные, которые нужны вам).
PM MAIL ICQ   Вверх
qweasd
Дата 15.4.2009, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 28.10.2006

Репутация: нет
Всего: нет



Цитата(Экскалупатор @ 15.4.2009,  14:37)
qweasd, если вам к примеру нужно отобразить значения из нескольких столбцов, и работать с этими значениями как с одним столбцом, то вы создаете запрос к базе(ну или прямо в DataSet) и создаете как бы виртуальный столбец, в котором содержаться нужные вам данные, и работаете уже с ними(это делается для того что бы не выбирать по очереди нужные данные, а сразу получить объединенные данные, которые нужны вам).

- это решение основано на том что я в БД создаю еще одну таблицу. Павельно я понял?
PM MAIL   Вверх
Idsa
Дата 15.4.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(qweasd @  15.4.2009,  18:36 Найти цитируемый пост)
С помощью WPF - возможна такая реализация? 

Да. ComboBox.ItemTemplate

Кстати, если уж и использовать вычисляемые столбцы, то делать это стоит на клиенте, создав в DataTable дополнительный столбец и задав ему Expression, который конкатенировал бы значения 3-х столбцов.

P. S. Реализация тривиального DAL через DataSet/DataTable на современном этапе развития .NET меня несколько выводит из себя. Не обращайте внимания: я могу быть немного неадекватен smile


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
qweasd
Дата 15.4.2009, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 28.10.2006

Репутация: нет
Всего: нет



Ага спасибо. Сейчас попробую.

Код

            MyDataSet = new DataSet();
            MyAdapter = new MySqlDataAdapter("SELECT * FROM invent.fullname", MyConn);
            MyAdapter.Fill(MyDataSet, "fullname");
            MyDataSet.Tables["fullname"].Columns.Add("fio", typeof(string), "Lastname+' '+Firstname+' '+Secondname");
         
            
            comboBox1.DataSource = MyDataSet.Tables["fullname"];
            comboBox1.ValueMember = "id";
            comboBox1.DisplayMember = "fio";


- оо вот так вот получилось то что хотел))) САСИБО.
Это оптимальный способ или есть чтото лучше?

Это сообщение отредактировал(а) qweasd - 15.4.2009, 15:47
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0858 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.