Member 13624040 Ответов: 2

Как отобразить отношение в datagridview в C#?


У меня есть две таблицы Routes и RouteInvoices.
Routes имеет столбцы RouteId и RouteName.
RouteInvoices имеет столбцы RouteId и некоторые другие столбцы счетов-фактур маршрутов.
Эти две таблицы связаны с использованием RouteID в качестве внешнего ключа в RouteInvoices.

Что я уже пробовал:

Я использую datagridview для отображения RouteInvoices в моем приложении

SQLiteDataAdapter adapter = new SQLiteDataAdapter("SELECT * FROM [route_invoices];", conn);
            DataTable table = new DataTable();
            adapter.Fill(table);

            dataGridView1.DataSource = table;


Это показывает routeID в таблице routeinvoices, но я хочу отобразить имя маршрута.
Как мне это сделать?

2 Ответов

Рейтинг:
14

Maciej Los

Все, что вам нужно, это использовать правильный запрос, например:

SELECT R.*, RI.*
FROM routes AS R INNER JOIN [route_invoices] AS RI ON R.RouteID = RI.RouteID


Приведенный выше запрос вернет данные из routes таблица и соответствующие данные из route_invoices стол.

Другими словами, вы должны улучшить свои знания о язык SQL[^].

Существует несколько типов соединений. На случай, если вы захотите их обнаружить, я бы посоветовал прочитать это: Визуальное представление SQL-соединений[^]


Leif Burrow

-...правильный вопрос...?
"Другими словами, вы должны улучшить свои знания о SQL."?!?

Неужели?

Как излишне снисходительно, даже не будучи лучшим решением!

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

Не поймите меня неправильно, для небольших наборов данных, которые будут быстро отброшены, использование соединения является простым решением и может быть приемлемым. Это вряд ли лучшее решение для каждой ситуации, и поэтому, конечно, не оправдывает предположение, что спрашивающий не знает SQL. Или подразумевается для всех остальных, кто находит это в результате поиска, что это всегда правильный путь.

Рейтинг:
0

Leif Burrow

Используйте строго типизированный набор данных, включающий таблицы Routes и RouteInvoices.
Определите связь между таблицами Route и RouteInvoices. VisualStudio, вероятно, назовет его FK_Routes_RouteInvoices.

Я бы включил код для этого, но я всегда делаю это через дизайнера.

Затем вы можете добавить столбец выражения в RouteInvoicesTable

routeDS.RouteInvoices.Columns.Add("RouteName", typeof(string), "Parent(FK_Routes_RouteInvoices).RouteName");


Теперь, если вы загрузите все свои маршруты в таблицу маршрутов строго типизированного набора данных и все счета, с которыми вы работаете, в таблицу RouteInvoices автоматически появится "дополнительный" столбец в RouteInvoices с именем RouteName, который вы можете отобразить в DataGrid и автоматически искать имя маршрута для вас при доступе.

Я видел решения, опубликованные в другом месте, которые пропускают добавление нового столбца и вместо этого просто помещают "Parent(FK_Routes_RouteInvoices).RouteName" как DataPropertyName нового столбца в DataGridView. Однако это не сработало, когда я попробовал это сделать.

Вы также можете опустить часть "(FK_Routes_RouteInvoices)". Это работает до тех пор, пока существует только одно определенное отношение. Если их несколько, то вам нужно указать, какое именно отношение.