Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
AlekseyHM
0 / 0 / 0
Регистрация: 06.04.2013
Сообщений: 4
1

Отображение полей связанных таблиц

06.04.2013, 16:44. Просмотров 3638. Ответов 7
Метки нет (Все метки)

Здравствуйте. Существуют таблицы: Товары, тип товара, категория. "Тип товара" связанны с "категорией", а "товары" с "типом товара". т.е. в таблице "товары" есть столбец idTiptovara, а в таблице "тип товара" столбец idkategoria. Как вывести все эти данные в один DataGridView, только не их id а наименование.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2013, 16:44
Ответы с готовыми решениями:

Отображение связанных таблиц
Здравствуйте Не подскажите как такое можно реализовать? Есть 2 таблицы на форме. Они связаны 2...

WPF, DataGrid, Entity Framework - отображение и редактирование связанных таблиц
Привет! Использую существующую БД MS SQL. На ее основе создаю модель EF. На форме MainWindow лежит...

Редактирование произвольной таблицы, если ряд полей таблиц содержит коды объектов из других таблиц
Уважаемые, Гуру! Хотелось бы построить редактор произвольной таблицы БД. Загрузка таблицы "select...

Вывод связанных полей в DataGrid
Добрый день. Как вывести в DataGrid значения связанных полей из другой таблицы?

Работа с Id из связанных таблиц
Всем доброго времени суток!!! Работаю на языке с# c средой разработки баз данных ms sql server...

7
Sanek92
3 / 3 / 2
Регистрация: 03.01.2012
Сообщений: 66
06.04.2013, 17:00 2
С SQL знакомы?
1
AlekseyHM
0 / 0 / 0
Регистрация: 06.04.2013
Сообщений: 4
06.04.2013, 17:20  [ТС] 3
Не так хорошо как хотелось бы. Т.е. это делается через запросы?

Добавлено через 16 минут
И действительно. Все оказалось проще, чем я ожидал.
0
stepa1807
0 / 0 / 0
Регистрация: 06.11.2012
Сообщений: 16
26.05.2013, 11:48 4
и как опишию
0
smth
179 / 48 / 6
Регистрация: 23.06.2011
Сообщений: 248
28.05.2013, 21:47 5
Вопрос в том, как в принципе данные попадают в DataGridView. Если запрос типа select from + join итд - одно дело, а если через DataAdapter + DataTable + BindingSource - то другое. Я после php в довольно простых таблицах начал делать запросы с join ради отображения связанных с foreign key данных, а оказалось все проще - DataGeidView с небольшими доработками делает чудеса.
2
Learx
1046 / 853 / 194
Регистрация: 31.03.2010
Сообщений: 2,490
29.05.2013, 10:29 6
smth, а можно подробнее про чудеса DataGridView? сколько с ним работаю но по прежнему использую join запросы ну или в лучшем случае ComboBoxColumn для Id и привязка этой колонки к инсточнику.
0
Midnayt
57 / 57 / 7
Регистрация: 07.12.2009
Сообщений: 321
Завершенные тесты: 1
29.05.2013, 11:50 7
Если вы действительно хотите увидеть чудеса тогда вам сюда http://www.devexpress.com/Products/NET/Controls/WinForms/ Это как бы дополнение к Visual Studio фреймфорков с множеством новых контролов.
0
smth
179 / 48 / 6
Регистрация: 23.06.2011
Сообщений: 248
29.05.2013, 22:46 8
Ну, насчет чудес я погорячился, конечно ) Но в моем варианте не требуется многоуровневых join даже в том случае, если одна таблица связана внешними ключами с тремя и более таблицами. Чтобы изменить или добавить запись, не приходится обрабатывать хитрые запросы, достаточно на форму пихнуть bindingNavigator - и все, добавление, редактирование, удаление - с минимальными доработками. Но есть и минус: приходится грузить из бд все таблицы (нужные поля всех таблиц), связи с которыми нам нужны. Пример:

Таблица А:
id (int, PKey) login (nvarchar) username (int) pass (nchar(32))

Таблица В:
id (int, PKey) realname (nvarchar) mail (nvarchar) birthday (date)

A.login --> B.id

Например, пусть в DataGridView (dgv) отображается таблица А, где в поле username хотим видеть не цифру (id связанной таблицы), а realname.

Вместо ShowData() в реальной форме можно использовать FormLoad().

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
using System;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
using System.Diagnostics;
 
namespace Test
{
    class Class1
    {
        SqlConnection conn;
        DataTable dtA, dtB;
        SqlDataAdapter daA, daB;
        BindingSource bsA, bsB;
 
        void ShowData()
        {
            conn = new SqlConnection("<connectionString>");
            bsA = new BindingSource(); bsB = new BindingSource();
            daA = new SqlDataAdapter("select * from A", conn);
            daB = new SqlDataAdapter("select * from B", conn);
 
            // без этого не будут работать update, delete ... в bindingNavigator'е
            SqlCommandBuilder scb = new SqlCommandBuilder(daA);
 
            dtA = new DataTable(); dtB = new DataTable();
 
            try
            {
                // я предпочитаю явно открывать соединение, чтобы в 
                // finally его явно закрыть
                conn.Open();
                daA.Fill(dtA); daB.Fill(dtB);
            }
            catch (SqlException ex)
            {
                // перехватываем номера ошибок SQL
            }
            catch (Exception ex)
            {
                // перехватываем что-нибудь оставшееся, хотя что тут может быть
            }
            finally
            {
                conn.Close();
            }
 
            bsA.DataSource = dtA; bsB.DataSource = dtB;
 
            // скрываем колонку с первичным ключом. Если пк вообще не выводить из бд,
            // нельзя будет пользоваться BindingNavigator, избавляющий от головной боли
            // с ручной навигацией в бд и сохранении изменений
            dgv.Columns[0].Visible = false;
 
            // создаем новую колонку с выпадающим списком
            DataGridViewComboBoxColumn columnUser = new DataGridViewComboBoxColumn();
            // удаляем колонку со значениями id из dgv
            dgv.Columns.RemoveAt(2);
            // говорим, в какую колонку из ВЫВОДИМОЙ таблицы (дочерней) будет подставляться
            // значение из родительской
            columnUser.DataPropertyName = "username";
            // источник данных для колонки
            columnUser.DataSource = bsB;
            // это поле будет ключом
            columnUser.ValueMember = "id";
            // это - выводимым значением
            columnUser.DisplayMember = "realname";
            // заголовок
            columnUser.HeaderText = "Имя";
            // стрелка списка появляется только в режиме редактирования
            columnUser.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;
            // разрешаем сортировку
            columnUser.SortMode = DataGridViewColumnSortMode.Automatic;
            // добавляем новую колонку на позицию 2 в dgv
            dgv.Columns.Insert(2, columnUser);
 
            dgv.DataSource = bsA;
        }
    }
}
Если нужны данные из каких-либо еще таблиц, добавляешь для них DataTable, DataAdapter, BindingSource и соответствующие колонки в dgv.

Сам я меньше месяца начал в этом копаться, по работе пришлось. Мне самому не очень нравится тащить из бд все связанные таблицы для подстановки. С другой стороны, если сформировать запрос с join - то выведем нужный результат без возможности редактирования. Если кто-то на данном примере покажет, как можно сделать иначе, буду премного благодарен!

Добавлено через 30 минут
Забыл дописать: если dgv заполнить запросом типа
T-SQL
1
select A.login, A.pass, B.realname, B.mail from A join B on A.username = B.id
, то данные также прекрасно выведутся, но при попытке добавить нового пользователя (предположим, что остальные поля необязательные) получаем Exception: Dynamic SQL generation is not supported against multiple base tables.
3
29.05.2013, 22:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2013, 22:46

Сохранение связанных таблиц
Доброго времени суток! Проблема заключается в том что у меня есть три таблицы в БД,...

Выборка данных из связанных таблиц
Всем привет! Столкнулся с проблемой выборки данных из связанных таблиц.Есть БД Access, читаю с...

Вывод связанных таблиц в datagridview
Помогите, пожалуйста, мне вот в каком вопросе: На форме находится datagridview. Есть...


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

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

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