Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > ComboBox и DataSet


Автор: qweasd 14.4.2009, 10:42
Здравствуйте!

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

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). Как это сделать?

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


Код

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

Автор: qweasd 14.4.2009, 15:57
Но не отобразит все 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)))

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

Автор: -Mikle- 14.4.2009, 16:52
Цитата(Экскалупатор @  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");

Автор: qweasd 15.4.2009, 12:58
Цитата

можно попробовать сделать вычисляемый столбец(соеденить в нем значения из трех нужных) и его уже отобразить в 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 можно както скрыть часть введенного текста

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

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

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

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

Автор: Экскалупатор 15.4.2009, 13:13
Цитата

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

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

Автор: qweasd 15.4.2009, 14:26
Что такое "вычисляемый столбец"

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

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

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

Автор: qweasd 15.4.2009, 14:36
С помощью WPF - возможна такая реализация?

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

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

- это решение основано на том что я в БД создаю еще одну таблицу. Павельно я понял?

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

Да. ComboBox.ItemTemplate

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

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

Автор: qweasd 15.4.2009, 14:55
Ага спасибо. Сейчас попробую.

Код

            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";


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

Автор: Экскалупатор 15.4.2009, 16:08
Цитата

это решение основано на том что я в БД создаю еще одну таблицу. Павельно я понял?

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

Автор: -Mikle- 15.4.2009, 22:54
Цитата(Idsa @  15.4.2009,  17:49 Найти цитируемый пост)
Кстати, если уж и использовать вычисляемые столбцы, то делать это стоит на клиенте, создав в DataTable дополнительный столбец и задав ему Expression, который конкатенировал бы значения 3-х столбцов.

Цитата(qweasd @  15.4.2009,  17:55 Найти цитируемый пост)
- оо вот так вот получилось то что хотел))) САСИБО.


А я и Экскалупатор что мы предлагали вам сразу в превых же ответах?
Цитата(-Mikle- @  14.4.2009,  19:52 Найти цитируемый пост)
Вычисляемый столбец:



Цитата(Idsa @  15.4.2009,  17:49 Найти цитируемый пост)
Реализация тривиального DAL через DataSet/DataTable на современном этапе развития .NET меня несколько выводит из себя.

Поддерживаю, меня тоже... видимо я тоже могу быть не адекватен  smile 

[quote=Idsa, 15.4.2009,  16:06, post1843157]А вообще, используйте WPF: там подобные вещи делаются гораздо удобнее[/quote
Поддерживаю на все 100%. Я сейчас вообще не использую WinForms, только WPF.

Автор: qweasd 16.4.2009, 09:51
Огромное всем спасибо. Да когдато разбирался в WPF - понравилось но на практике мало юзаю - больше пишу на С++(API MFC).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)