Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Два combobox. Привязка к данным.


Автор: eon 23.11.2010, 14:24
VS08C# SQLServer08
Есть два combobox.
Первый заполняется при загрузке формы из таблицы naimenovanie:
Код

string connectionString = "Data Source=blablabla;Initial Catalog=req;Persist Security Info=True; Integrated Security = true";
            SqlConnection con = new SqlConnection(connectionString);
            string command = "SELECT * FROM naimenovanie ORDER BY ord";
            SqlDataAdapter da = new SqlDataAdapter(command, con);
            DataSet ds = new DataSet();
            con.Open();
            da.Fill(ds);
            con.Close();
            comboBox1.DataSource = ds.Tables[0];
            comboBox1.DisplayMember = "naimenovanie_name";
            comboBox1.ValueMember = "id";
            comboBox1.SelectedIndex = 0;

Второй в зависимости от того, что выбрано в первом, загружает данные из таблицы utochnenie при событии comboBox1_SelectedIndexChanged:
Код

string connectionString = "Data Source=blablabla;Initial Catalog=req;Persist Security Info=True; Integrated Security = true";
            SqlConnection con = new SqlConnection(connectionString);
            string command = "SELECT * FROM utochnenie WHERE naimenovanie_id=" + (comboBox1.SelectedIndex+1) + " ORDER BY ord ";
            SqlDataAdapter da = new SqlDataAdapter(command, con);
            DataSet ds = new DataSet();
            con.Open();
            da.Fill(ds);
            con.Close();
            comboBox2.DataSource = ds.Tables[0];
            comboBox2.DisplayMember = "utochnenie_name";
            comboBox2.ValueMember = "id";

Таблицы naimenovanie и utochnenie связаны по полю naimenovanie_id в таблице utochnenie.
Строка
Код

string command = "SELECT * FROM utochnenie WHERE naimenovanie_id=" + (comboBox1.SelectedIndex+1) + " ORDER BY ord ";

неверная, хотя работает.
Вопрос:как изменить SELECT, чтобы выбиралось:
"SLECET * FROM utochnenie WHERE naimenovanie_id = <ИД НАИМЕНОВАНИЯ ВЫБРАННОГО В ПЕРВОМ КОМБОБОКСЕ> ORDER BY ord"

Спасибо.

Автор: A5uKa 23.11.2010, 14:45
ComboBox1.SelectedItem.Value.ToString()

Автор: Freyzer 23.11.2010, 14:46
Может тут что поможет http://www.google.ru/search?ie=UTF-8&hl=ru&q=%D0%94%D0%B2%D0%B0%20combobox.%20%D0%9F%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0%20%D0%BA%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC.&redir_esc=y&ei=LKjrTMuZJYbBswaarcX2Dg

Автор: eon 23.11.2010, 15:09
Цитата(A5uKa @ 23.11.2010,  14:45)
ComboBox1.SelectedItem.Value.ToString()

Не идет :(

Автор: eon 23.11.2010, 15:32
Код

string command = "SELECT * FROM utochnenie WHERE naimenovanie_id = (SELECT id FROM naimenovanie WHERE naimenovanie_name = '" + (comboBox1.SelectedText) + "') ORDER BY ord ";


Это то что нужно.
Но почему-то после comboBox1.SelectedIndex = 0; comboBox1.SelectedText остается пустым. Кто-нибудь знает, почему?

Автор: A5uKa 23.11.2010, 15:53
Цитата(eon @ 23.11.2010,  15:32)
Код

string command = "SELECT * FROM utochnenie WHERE naimenovanie_id = (SELECT id FROM naimenovanie WHERE naimenovanie_name = '" + (comboBox1.SelectedText) + "') ORDER BY ord ";


Это то что нужно.
Но почему-то после comboBox1.SelectedIndex = 0; comboBox1.SelectedText остается пустым. Кто-нибудь знает, почему?

Я не понимаю что надо тогда ... Задай вопрос более конкретно, а то куски непонятно чего везде и что из этого не работает и как работать должно я не понимаю.

Пустым остаётся скорее всего из-за того, что ты PostBack не делаешь. 

Автор: eon 23.11.2010, 15:59
От первоначального вопроса уже перешел к следующему:
Заполнил комбобокс данными программно из таблицы БД. При событии comboBox1_SelectedIndexChanged смотрю comboBox1.SelectedIndex - отображается правильно (ну если выбрал третью строку в комбобоксе то и будет comboBox1.SelectedIndex = 2), а вот comboBox1.SelectedText и comboBox1.SelectedItem as string остаются пустыми, хотя третья строка в комбобоксе не пустая естественно.

Проект WinForms, а не ASP.NET. это по поводу postback'a.

Автор: neic 23.11.2010, 16:32
eon
comboBox1.SelectedText  замени на comboBox1.Text 

Старое (оставил может пригодиться):
Как я понял:

У нас есть:
1 БД
2 Комобобокса

Первый комбобокс подгружает данные из БД и содержит в себе список наименований чего-то.

Нужно:
Чтобы при выборе в первом кобобоксе какого-либо пункта: считался номер строки (он же видимо ID) и подгружались данные из БД?

Если я прав, то:

Во-первых: в первом комбобоксе сделай событие comboBox1.SelectedIndex (или TextChanged) и туда перемести код заполнения второго.

Во-вторых:
            string t = comboBox1.Text; //возвращаем выбранную строку, т.е. если у нас строка с индексом три = Привет, то будет t="Привет".

            int i = comboBox1.SelectedIndex; //собственно выбранная строка

В-третьих: запрос для заполнения второго будет таков:
если SelectedIndex является ID:
"SLECET * FROM utochnenie WHERE naimenovanie_id ="+ comboBox1.SelectedIndex + " ORDER BY ord"

если Text является ID:
"SLECET * FROM utochnenie WHERE naimenovanie_id ="+ Convert.ToInt32(comboBox1.Text) + " ORDER BY ord"

Автор: jonie 23.11.2010, 17:04
В аттаче пример как это делать, без всяких запросов можно сделать.. используя биндинг и DataSet например

Автор: neic 23.11.2010, 17:08
jonie
Кстати да, через мастера можно было бы все настроить =)

Автор: jonie 23.11.2010, 17:17
neic, ну в своем примере я не делал релейшена, хотя он тут уместен. Я показал как именно получить id выбранный и выбрать по нему записи

Автор: eon 24.11.2010, 07:00
Цитата(neic @ 23.11.2010,  16:32)
eon
comboBox1.SelectedText  замени на comboBox1.Text 

Старое (оставил может пригодиться):
Как я понял:

У нас есть:
1 БД
2 Комобобокса

Первый комбобокс подгружает данные из БД и содержит в себе список наименований чего-то.

Нужно:
Чтобы при выборе в первом кобобоксе какого-либо пункта: считался номер строки (он же видимо ID) и подгружались данные из БД?

Если я прав, то:

Во-первых: в первом комбобоксе сделай событие comboBox1.SelectedIndex (или TextChanged) и туда перемести код заполнения второго.

Во-вторых:
            string t = comboBox1.Text; //возвращаем выбранную строку, т.е. если у нас строка с индексом три = Привет, то будет t="Привет".

            int i = comboBox1.SelectedIndex; //собственно выбранная строка

В-третьих: запрос для заполнения второго будет таков:
если SelectedIndex является ID:
"SLECET * FROM utochnenie WHERE naimenovanie_id ="+ comboBox1.SelectedIndex + " ORDER BY ord"

если Text является ID:
"SLECET * FROM utochnenie WHERE naimenovanie_id ="+ Convert.ToInt32(comboBox1.Text) + " ORDER BY ord"

Спасибо за равернутый ответ.
НО..
ID  в бд и порядок следования в combobox1 не обязательно совпадают.
Сделал замену на comboBox1.Text, всё работает хорошо, но только если вручную поменял я выбранный пункт в combobox1.
То есть у меня в событии формы Form1_Load написано

Код

comboBox1.SelectedIndex = 0;

Вроде после этой строки должно вызваться событие
Код

comboBox1_SelectedIndexChanged

А оно почему-то не вызывается.
Оно вызывается когда я уже сам вручную поменяю на форме выбранный пункт в combobox1.

Автор: eon 24.11.2010, 07:56
Всем спасибо. Проблему решил.

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