Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# и базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 43, средняя оценка - 4.70
davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
#1

Привязка данных в двух DataGridView - C#

07.07.2009, 09:34. Просмотров 5632. Ответов 26
Метки нет (Все метки)

Всем привет! У меня такой вот вопрос:
Есть 2 DataGridView.
В первый данные вносятся с помощью запроса типа:
SQL
1
SELECT id_marka, model, price FROM cars
Во второй запросом типа:
SQL
1
SELECT name FROM marka WHERE id_marka=<ид из первой таблицы>
Надо, чтобы при перемещении по строкам первого DataGridView, во втором данные менялись в зависимости...

Для простых LabelBox, TextBox и пр., используется BindingSource, а для DataGridView?

Если есть простой пример у кого, скиньте плиз...
http://www.cyberforum.ru/ado-net/thread109588.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2009, 09:34
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Привязка данных в двух DataGridView (C#):

Удобная привязка данных в DataGridView
Всем привет! Хотел спросить такой вот вопрос. Дело в том,что очень часто мне...

Привязка данных к DataGridView на связном уровне
Как в результате многотабличного запроса привязать данные к DataGridView без...

DataGridView - привязка свойств строки к источнику данных
Подскажите, пожалуйста, возможно ли осуществить привязку свойств строки(к...

Привязка данных к уже созданным столбцам DataGridView
у меня вопрос: если я создам в dgv столбцы вручную, пропишу их свойства в...

Привязка данных к элементу управления DataGridView в Windows Forms
Здравствуйте, есть форма с двумя DataGridView. Сделал по этому примеру:...

26
Sergei
1446 / 713 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
07.07.2009, 10:19 #2
Лучший ответ Сообщение было отмечено как решение

Решение

Надо создавать связь между таблицами в DataSet
C#
1
2
3
 DataRelation dr = new DataRelation("ProductsTask", dsTask.Tables["Products"].Columns["IDProduct"],
                dsTask.Tables["Tasks"].Columns["IDProduct"]);
            dsTask.Relations.Add(dr);
и далее назначить источники данных
C#
1
2
3
4
5
6
7
8
9
10
11
12
 taskAdapt = new OleDbDataAdapter("SELECT * FROM Tasks", oleCon);
            prodAdapt = new OleDbDataAdapter("SELECT * FROM Products", oleCon);
            taskBuild = new OleDbCommandBuilder(taskAdapt);
            prodBuild = new OleDbCommandBuilder(prodAdapt);
            taskAdapt.Fill(dsTask, "Tasks");
            prodAdapt.Fill(dsTask, "Products");
            BuildRelationship();
            dtGridProducts.DataSource = dsTask;
            dtGridProducts.DataMember = "Products";
            tsBinding.DataSource = dsTask;
            dtGridTasks.DataSource = dsTask;
           dtGridTasks.DataMember = "Products.ProductsTask";
3
davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
07.07.2009, 13:05  [ТС] #3
Отлично, спасибо! Разобрался тут. Теперь другая проблема появилась.

Как мне теперь созданную связь привязать, например к TextBox

У TextBox нету свойства DataSource.
0
Sergei
1446 / 713 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
07.07.2009, 21:51 #4
Да но зато есть свойство DataBindings вот можно сделать так
C#
1
2
3
4
5
6
7
8
9
10
OleDbConnection conn = new OleDbConnection(connectionString);
conn.Open();
OleDbCommand myCommand = new OleDbCommand();
myCommand.Connection = conn;
myCommand.CommandText = commandText;
OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
dataAdapter.SelectCommand = myCommand;
DataSet ds = new DataSet();
dataAdapter.TableMappings.Add("Table", "Поставщики");
dataAdapter.Fill(ds);
Далее связываем с текстбоксами
C#
1
2
3
txtID.DataBindings.Add("Text", ds, "Поставщики.Кодпоставщика");
txtPhone.DataBindings.Add("Text", ds, "Поставщики.Поставщик");
txtProvider.DataBindings.Add("Text", ds, "Поставщики.Телефон");
Пример учебный Вам надо разобраться с этим свойством DataBindings
2
davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
10.07.2009, 11:16  [ТС] #5
Ты меня немного не понял.

Проблема не в том, чтобы связать простые данные с ТекстБоксом. Вот что я делаю:


C#
1
2
3
4
5
6
7
8
9
MySqlDataAdapter grupAdapt = new MySqlDataAdapter("SELECT * FROM grup", conn);
MySqlDataAdapter studAdapt = new MySqlDataAdapter("SELECT * FROM stud", conn);
MySqlDataAdapter commAdapt = new MySqlDataAdapter("SELECT * FROM comment", conn);
MySqlCommandBuilder grupBuild = new MySqlCommandBuilder(grupAdapt);
MySqlCommandBuilder studBuild = new MySqlCommandBuilder(studAdapt);
MySqlCommandBuilder commBuild = new MySqlCommandBuilder(commAdapt);
grupAdapt.Fill(ds, "grup");
studAdapt.Fill(ds, "stud");
commAdapt.Fill(ds, "comment");
Далее создаю связь:
C#
1
2
3
DataRelation dr = new DataRelation("GrupStud", ds.Tables["grup"].Columns["id_grup"],
                ds.Tables["stud"].Columns["id_grup"]);
ds.Relations.Add(dr);
Группы - в первый DataGridView, студентов - во второй:

C#
1
2
3
4
dataGridView1.DataSource = ds;
dataGridView1.DataMember = "grup"; 
dataGridView2.DataSource = ds;
dataGridView2.DataMember = "grup.GrupStud";
Теперь надо, чтобы в TexnBox-e была информация из третьей таблицы: comment. Если бы я хотел отображать эту информацию в DataGridView, я бы создал связь:
C#
1
2
3
DataRelation drr = new DataRelation("StudComment",ds.Tables["comment"].Columns["id_c"],
                ds.Tables["stud"].Columns["id_c"]);
ds.Relations.Add(drr);
Но мне надо информацию из этой связи (точнее 1 столбец: comment), отображать в TextBox)

Более того, надо, чтобы при перемещении по DataGridView (у которого DataMember = "grup.GrupStud", т.е. связь), менялись данные в TextBox, в котором информация из третьей таблицы...

В общих чертах...
0
Green
1919 / 424 / 40
Регистрация: 12.07.2007
Сообщений: 2,062
Завершенные тесты: 2
13.07.2009, 07:16 #6
Цитата Сообщение от davian Посмотреть сообщение
Теперь надо, чтобы в TexnBox-e была информация из третьей таблицы: comment. Если бы я хотел отображать эту информацию в DataGridView, я бы создал связь:
Вот и нужно создать связь. И затем забиндить на нее. Т.к. TextBox не может отображать наборы данных, то ему нужен переход в конечное свойство.
Код
textBox1.DataBindings.Add("Text", ds, "stud.StudComment.id_c");
1
Sergei
1446 / 713 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
13.07.2009, 10:20 #7
Green прав так и надо делать. Я же Вам написал что пример учебный надо разбираться со свойством DataBindings.
Будут еще вопросы справшивайте.
1
davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
13.07.2009, 13:55  [ТС] #8
Цитата Сообщение от Green Посмотреть сообщение
Вот и нужно создать связь. И затем забиндить на нее. Т.к. TextBox не может отображать наборы данных, то ему нужен переход в конечное свойство.
Код
textBox1.DataBindings.Add("Text", ds, "stud.StudComment.id_c");

Хорошо. Отображает id_c из связанной таблицы... Но.... только для самой первой записи. Надо обеспечить обновление TextBox при перемещении по DataGridView... Причем необходимо, чтобы данные динамически менялись во всех трех объектах:

Список групп (DataGridView1) -> Список студентов в группе (DataGridView2) -> Комментарии к каждому студенту (TextBox)
0
Sergei
1446 / 713 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
13.07.2009, 15:24 #9
davian а Вам обязательно надо делать привязку данный можете просто выбирать нужного студента из таблице по его ID и в текстбокс вставлять нужные данные.
1
davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
13.07.2009, 15:28  [ТС] #10
Цитата Сообщение от Sergei Посмотреть сообщение
davian а Вам обязательно надо делать привязку данный можете просто выбирать нужного студента из таблице по его ID и в текстбокс вставлять нужные данные.
Это хорошее простое решение, но мне интересен этот вопрос в принципе... Если есть ответ, то хотелось бы его знать...
0
Sergei
1446 / 713 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
13.07.2009, 15:32 #11
Вот посмотрите в приложенных файлах там есть немного теории.
1
Вложения
Тип файла: rar DB.rar (93.8 Кб, 66 просмотров)
davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
13.07.2009, 15:55  [ТС] #12
Огромное спасибо за все ответы. Вы мне очень помогли. С теорией мне действительно стоит немного четче разобраться. Обязательно изучу предложенный вами, Sergei, материал.
1
Sergei
1446 / 713 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
13.07.2009, 16:02 #13
Да конечно рассмотрите для начала простые примеры что бы понять принцип, а потом примените к своему приложению. Будут вопросы спрашивайте.
1
Green
1919 / 424 / 40
Регистрация: 12.07.2007
Сообщений: 2,062
Завершенные тесты: 2
14.07.2009, 02:13 #14
Цитата Сообщение от davian Посмотреть сообщение
Хорошо. Отображает id_c из связанной таблицы... Но.... только для самой первой записи. Надо обеспечить обновление TextBox при перемещении по DataGridView... Причем необходимо, чтобы данные динамически менялись во всех трех объектах:

Список групп (DataGridView1) -> Список студентов в группе (DataGridView2) -> Комментарии к каждому студенту (TextBox)
Для этого необходимо использовать BindingSource. К BindingSource привязываете данные, т.е. DataSet, DataTable, DataColumn. Затем контролам назначаете эти BindingSource.
Берете первый BindingSource (BS) к нему привязываете список групп, затем берете второй BS и привязываете его к первому (т.е. указываете в DataSource), а в DataMember у этого второго BS указываете связь со списком студентов. Берете третий BS и привязываете его ко второму, аналогично, в DataMember указываете связь от студента к комментам. Затем все BS указываете контролам.

Из книг советую прочитать "Brian Noyes. Data Binding with Windows Forms 2.0: Programming Smart Client Data Applications with .NET".
1
davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
14.07.2009, 10:28  [ТС] #15
Предложенное вами, Green, решение, я реализовал так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
DataSet ds = new DataSet();
 
MySqlDataAdapter grupAdapt = new MySqlDataAdapter("SELECT * FROM grup", conn);
MySqlDataAdapter studAdapt = new MySqlDataAdapter("SELECT * FROM stud", conn);
MySqlDataAdapter commAdapt = new MySqlDataAdapter("SELECT * FROM comment", conn);
MySqlCommandBuilder grupBuild = new MySqlCommandBuilder(grupAdapt);
MySqlCommandBuilder studBuild = new MySqlCommandBuilder(studAdapt);
MySqlCommandBuilder commBuild = new MySqlCommandBuilder(commAdapt);
 
grupAdapt.Fill(ds, "grup");
studAdapt.Fill(ds, "stud");
commAdapt.Fill(ds, "comment");
 
DataRelation dr = new DataRelation("GrupStud", ds.Tables["grup"].Columns["id_grup"],
                ds.Tables["stud"].Columns["id_grup"]);
ds.Relations.Add(dr);
DataRelation drr = new DataRelation("StudComment",ds.Tables["stud"].Columns["id_c"],
                ds.Tables["comment"].Columns["id_c"],false);
ds.Relations.Add(drr);
 
BindGrup = new BindingSource();
BindGrup.DataSource = ds;
BindGrup.DataMember = "grup";
BindStud = new BindingSource();
BindStud.DataSource = BindGrup;
BindStud.DataMember = "grup.GrupStud";
BindComment = new BindingSource();
BindComment.DataSource = BindStud;
BindComment.DataSource = "stud.StudComment";
 
dataGridView1.DataSource = BindGrup;
dataGridView1.DataMember = "grup"; 
dataGridView2.DataSource = BindStud;
dataGridView2.DataMember = "grup.GrupStud";
 
textBox2.DataBindings.Add("Text", BindComment, "stud.StudComment.comment");
На 27 строке возникает исключение "Свойство 'grup.GrupStud' для DataMember не найдено в DataSource". Что я не правильно сделал?
1
Green
1919 / 424 / 40
Регистрация: 12.07.2007
Сообщений: 2,062
Завершенные тесты: 2
15.07.2009, 03:22 #16
Код
BindStud.DataSource = BindGrup;
BindStud.DataMember = "GrupStud";
1
davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
15.07.2009, 08:22  [ТС] #17
Огромное спасибо за ответы!!!

Цитата Сообщение от Green Посмотреть сообщение
Из книг советую прочитать "Brian Noyes. Data Binding with Windows Forms 2.0: Programming Smart Client Data Applications with .NET".
Нет этой книги на русском? Или какой-нибудь подобной, только на русском...
0
Лилик
0 / 0 / 0
Регистрация: 22.05.2009
Сообщений: 3
15.07.2009, 15:43 #18
Спасибо за примеры
0
Лакшми
44 / 44 / 1
Регистрация: 09.07.2009
Сообщений: 402
Завершенные тесты: 1
05.08.2009, 13:15 #19
Цитата Сообщение от Sergei Посмотреть сообщение
C#
1
2
3
txtID.DataBindings.Add("Text", ds, "Поставщики.Кодпоставщика");
txtPhone.DataBindings.Add("Text", ds, "Поставщики.Поставщик");
txtProvider.DataBindings.Add("Text", ds, "Поставщики.Телефон");
У меня попутно вопрос. Если у меня имя поля составное, то оно не воспринимается. Например, пишу так:

C#
1
txtID.DataBindings.Add("Text", ds, "Поставщики.[Код поставщика]");
вылетает ошибка. Как быть?

Заранее благодарю за ответы!
0
MAcK
Комбайнёр
1571 / 669 / 77
Регистрация: 27.05.2008
Сообщений: 2,535
05.08.2009, 13:21 #20
Что за ошибка, правильно ли написали имя поля?
0
05.08.2009, 13:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2009, 13:21
Привет! Вот еще темы с решениями:

Вывод данных из двух таблиц в DataGridView
Привет Есть база, в ней 3 таблицы. В 1 таблице хранятся ФИО и ID. Во 2 таблице...

Представление в DataGridView данных из двух связанных таблиц
Здравствуйте. Есть DataSet, в нем две связанных таблицы, например таблица...

Вывод данных из двух таблиц БД в одну dataGridView
В БД две таблицы Reisi и Goroda. Таблицы связаны по полю IDtown. Пытаюсь...

Вывод двух связанных таблиц данных в один Datagridview
Если можете подскажите, очень надо:wall: Есть в БД SQL связанные таблицы: 1....


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

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

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