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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод связанных данных в DataGridView, По выделенному полю 
V
    Опции темы
Redsweet
Дата 25.4.2009, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 26.2.2009
Где: Казахстан

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



Есть две связанные таблицы по одному ключевому полю ID. 

Допустим первая таблица имеет вид:
ID
name
surname

Вторая таблица:
ID
mesto_obuch

Первую таблицу выводим в DataGridView. Как сделать так, чтобы при выделении ячейки мышкой автоматически в другом DataGridView отображались данные из второй таблицы связанные с первой по выделенному мышкой ID?
PM MAIL   Вверх
-Mikle-
Дата 25.4.2009, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



вот так:
Код

        DataSet ds;

        private void Form1_Load(object sender, EventArgs e)
        {
            ds = new DataSet();
            ds.Tables.Add(this.GetTable1());
            ds.Tables.Add(this.GetTable2());

            // *** вот эта ключевая строчка ***
            ds.Relations.Add("myRelation", ds.Tables["table1"].Columns["id"], ds.Tables["table2"].Columns["id"]);

            dataGridView1.DataSource = ds;
            dataGridView2.DataSource = ds;

            dataGridView1.DataMember = "table1";

            // *** и вот эта ***
            dataGridView2.DataMember = "table1.myRelation";
        }


Здесь две ключевые строчки, а остальные это я делал для теста.


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


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 26.2.2009
Где: Казахстан

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



-Mikle-, спасибо вам большое за ответ...
Но не могли бы вы его немного пояснить? Например мне совсем не понятна ваша первая ключевая строчка... user posted image
PM MAIL   Вверх
thomas
Дата 26.4.2009, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

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



Redsweet, 
Код

DataSet ds;

Это объявление переменной с именем ds типа DataSet.

Добавлено через 4 минуты и 34 секунды
Упс, не туда посмотрел.
Код

// *** вот эта ключевая строчка ***
            ds.Relations.Add("myRelation", ds.Tables["table1"].Columns["id"], ds.Tables["table2"].Columns["id"]);

здесь задается связь между таблицами в ДатаСет по полю id.
а вот здесь
Код

// *** и вот эта ***
            dataGridView2.DataMember = "table1.myRelation";

указывается что должно отображаться во втором гриде.



--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Redsweet
Дата 26.4.2009, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 26.2.2009
Где: Казахстан

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



Цитата(thomas @  26.4.2009,  15:29 Найти цитируемый пост)
Это объявление переменной с именем ds типа DataSet.

Мне не это не понятно! Я имею ввиду что не первая строчка кода, а первая ключевая!

Первая ключевая строчка это:
 
Код
 ds.Relations.Add("myRelation", ds.Tables["table1"].Columns["id"], ds.Tables["table2"].Columns["id"]);


Это сообщение отредактировал(а) Redsweet - 26.4.2009, 12:36
PM MAIL   Вверх
-Mikle-
Дата 27.4.2009, 03:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Redsweet, thomas дополнил свой ответ, вы разминулись с ним по времени.
Но я продублирую его ответ чуть шире.
В первой строчке задается связь, отношение (Relation) между двумя таблицами в DataSet.
Так как DataSet содержит может содержать много таблиц (и связей между ними), то все связи между таблицами располагаются в коллекции DataSet.Relations. Метод Add, соответственно добавляет одну связь.
Первый параметр этого метода, это имя этого отношения, второй - ссылка на DataColumn родительского поля, а третий - ссылка на DataColumn дочернего поля. Так как каждый DataColumn содержит ссылку на свой DataTable, то родительская и дочерняя таблица берутся из ссылок на поля (второй и третий параметр).

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


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


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 26.2.2009
Где: Казахстан

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



Что-то я никак не разберусь. Моя ситуация такая: на форме уже есть dataGridView в который уже выводятся данные из таблицы и называется он - diplDataGridView (где dipl - название таблицы). В этой таблице есть поле ID по которому она связывается с другой таблицей. Все связи уже настроены вручную в SQL Server-e. Задача в том, чтобы при щелчке мышью по записи в diplDataGridView, в другом DataGridView выводились связанные данные из другой таблицы. Т.е. связи настраивать не нужно, они уже есть.

При использовании приведенного выше кода Студия ругается на  
Код

ds.Tables.Add(this.GetTable1());
ds.Tables.Add(this.GetTable2()); - Error    1    'WindowsFormsApplication20.Form1' does not contain a definition for 'GetTable1' and no extension method 'GetTable1' accepting a first argument of type 'WindowsFormsApplication20.Form1' could be found (are you missing a using directive or an assembly reference?)    .....




Это сообщение отредактировал(а) Redsweet - 27.4.2009, 15:08
PM MAIL   Вверх
-Mikle-
Дата 27.4.2009, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Redsweet, я же сказал:
Цитата(-Mikle- @  25.4.2009,  22:37 Найти цитируемый пост)
две ключевые строчки, а остальные это я делал для теста


GetTable1 и GetTable2 это были мои методы которые генерировали тестовые данные. Они не нужны в вашем коде. В приведенном мной коде, нужно было обратить внимание только на две строчки.

Мне, да и кому-либо еще, тяжело писать ответы более конкретно, когда нет ни единой строчки вашего кода. Вот и приходится писать дополнительный код, чтобы продемонстрировать работу ответа. Я даже не знаю, храните ли вы данные в DataSet и делаете ли привязку через DataSource. Давайте так, чтоб быть более конструктивным, приведите здесь ваш код. Иначе мы будет ходить вогруг, да около... smile


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


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 26.2.2009
Где: Казахстан

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



-Mikle-, понимаете, мне нечего скинуть. В Студии я делала все не кодом, а настройками и перетаскиваниями. То есть у меня все генерировалось автоматически. У меня есть studDataSet, studTableAdapter, univerTableAdapter, tableAdapterManager, studBindingSource... Есть также два DataGridView. Не знаю, понятно ли я объяснила то что мне нужно.  user posted image Я хочу чтобы во второй таблице отображалась информация о месте обучения именно по тому студенту, чье имя (все поле - строка) выделено в первом DataGridView. И кода в проекте у меня почти нет.. Ну разве что строчки, которые сами создались типа: 
Код
this.studTableAdapter.Fill(this.studDataSet.stud);


Я пыталась применить себе именно те две ключевые строчки, которые вы выделили. Но у меня ничего не получилось... user posted image
PM MAIL   Вверх
-Mikle-
Дата 28.4.2009, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Вот это уже что-то. Более ясно что и как.
По шагам:
1. Правый клик по таблице студентов и выбрать Add -> Reletion... (Добваить -> Отношение...)
user posted image

2. В открывшемся окне задай такие параметры:
user posted image

3. Для первого грида в свойствах выбираем DataSource
user posted image

4. В DataMemeber выбираем таблицу студентов
user posted image

5. Для второго грида DataSource будет
user posted image

6. А вот DataMember нужно вбить ручками (стукая по клавиатуре пальчиком) в таком виде:
{ИмяТаблицыСтудентов}{.}{ИмяОтношения}
Имя отношения, это то, что ты вбивала во втором шаге.

в моем примере это выглядит так:
studDataTable.studDataTable_univerDataTable

Вот и все! Готово! Запускаем и наслаждаемся!


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


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 26.2.2009
Где: Казахстан

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



-Mikle-, спасибо большое! Кажется все работает как надо! user posted image
thomas, тоже спасибо что не прошли мимо!

Это сообщение отредактировал(а) Redsweet - 30.4.2009, 10:13
PM MAIL   Вверх
-Mikle-
Дата 30.4.2009, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Не за что. Приходи еще!  smile

Добавлено через 1 минуту и 42 секунды
Только желательно сразу формулировать вопрос полноценно с указанием необходимых деталей, а то будет как в этом топике, больше времени ушло на понимание самого вопроса, чем на его решение  smile 


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


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 26.2.2009
Где: Казахстан

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



Подскажите пожалуйста, что делать в случае если связь двух нужных таблиц идет через третью-вспомогательную. То есть теперь будут использоваться таблицы stud, dipl и conn. 

user posted image

Необходимо чтобы из comboBox выбирался студент, а в dataGridView отображались данные таблицы conn по этому студенту (связь через studID и diplID). Что писать в таком случае в DataMember? Пробовала даже такой вариант: (stud.FK_dipl_stud).FK_conn_dipl

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

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

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

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


 




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


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

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