10 / 10 / 1
Регистрация: 27.04.2010
Сообщений: 37
1

Как в одном DataGridView вывести данные из нескольких таблиц

27.04.2010, 19:37. Показов 30270. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте извините за повторения темы прошу строго не судить меня.у меня возникла проблема есть 5 таблицы
1-tovar содержит она (ID,Code,Firma_ID,Model_ID,Color_ID,Size_ID,Total_tovar)
2-firma содержит она (ID,cros)
3-model содержит она (ID,sl_55)
4-color содержит она (ID,black)
5-size содержит она (ID,xxl)
мне нужно чтобы в моём DataGridView получилось вот так
Code cros sl_55 black xxl total_tovar
и чтобы потом эти данные можно было редактировать и сохранять в БД

делал всё конструктором,сделал привязку к форме с помощью Binding Source в мастере настройки выбрал все свои таблицы появился компонент tmpDataSet далее из тоолбокса вытащил DataGridView
в нём выбрал источник данных таблицу tovar при выборе следующей таблицы (color) она заменила таблицу товар (а если выбирать FK_sell_tovar) то появляться поле ID и всё остальное пропадает


если вас не затруднит опишите пожалуйста,что и как делать куда вставлять по пунктам
я новичок в этом деле и много во не понимаю,а чтение книг плохо помогает
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.04.2010, 19:37
Ответы с готовыми решениями:

Как вывести данные в DataGridView из 2-х связанных таблиц в БД?
Здравствуйте! Разрабатываю приложение в среде VS, язык С#, встраиваемая база данных Firebird...

Как вывести данные из двух таблиц в один datagridview
Здравствуйте, уповаю на Вас. Никак не могу понять как выводить данные из двух таблиц в один...

Вывести результат запроса в DataGridView (запрос из нескольких таблиц)
Прошу помощи, не могу вывести результат запроса в котором участвует более 1 таблицы. Вот...

Отображение нескольких таблиц в нескольких dataGridView
Доброго всем времени суток, пишу программу на C# которая работает с БД access 2007. БД состоит из...

23
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
27.04.2010, 22:46 2
Лучший ответ Сообщение было отмечено как решение

Решение

Варианты
1 В базе делаете представление на выборку необходимых данных, в dataSet делаете адаптер на это представление
2. в dataSet сразу делаете адаптер со сложным запросом на выборку

Оба варианта годятся в основном для просмотра данных.

Для редактирования можно применить все как вы сделали, только столбцы с внешними индексами сделать в виде выпадающих списков (если не ошибаюсь свойство columnType)
4
10 / 10 / 1
Регистрация: 27.04.2010
Сообщений: 37
27.04.2010, 23:26  [ТС] 3
Спасибо за ответ,у меня,что то получилось методом научного тыка,залез в настройки DataSet там у меня была логическая модель моей БД нашёл в Properties CommandText там прописал
SQL
1
2
3
SELECT        tovar.ID, tovar.Code, tovar.Firma_ID, tovar.Model_ID, tovar.Color_ID, tovar.Size_ID, tovar.Total_tovar, SIZE.xxl
FROM            tovar INNER JOIN
                         SIZE ON tovar.Size_ID = SIZE.ID
к моим полям появилось поля xxl,пока больше полей не пробовал добавлять.

Теперь проблема новая,добавил на форму кнопку button (Update) в ней прописал как было написано в книги

C#
1
tovarTableAdapter.Update(tmpDataSet);
после того как поля все заполнил,нажимаю обновить и после этого вылетает ошибка,саму ошибку показать не могу так как сижу за другим компьютером.я думаю это всё из за того,что я добавил поля с другой таблицы

подскажите как правильно мне сохранить данные (button) с DataGridView
2
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
27.04.2010, 23:38 4
Тут самое главное правильно настроить свойства InsertCommand,UpdateCommand, DeleteCommand для соответсвующих адаптеров.
В Вашем случае происходит вызов адаптеров для всех таблиц размещенных в tmpDataSet. Смотрите сообщение об ошибке, там скорее всего указано, какой адаптер не срабатывает, его и правьте.
0
0 / 0 / 0
Регистрация: 07.05.2012
Сообщений: 13
07.05.2012, 19:50 5
nio, подскажите пожалуйста, как настроить эти свойства?

Они не создаются автоматически при таком изменённом Fill,GetData()-запросе. Я всё делал через мастеров, и аналогично в конструкторе своего dataset'а правой кнопкой жму на Fill,GetData()-запросе - Настроить - Дополнительно - ставлю все 3 галки - Далее - и нижний чекбокс ("Создайте методы для отправки обновлений непосредственно в базу данных. Создаёт методы Insert, Update, Delete которые...") не активен почему-то.

Порыскал по DataSetX.Designer.cs, там вроде создались методы эти, но только для одной из таблиц (у меня заказы и клиенты, к заказу в поле привязан один клиент (по ID), в модели связь "1 клиент <-> * заказов") - клиенты. А для более сложной таблицы заказы (в смысле имеющей связь с другой таблицей) не создались.
0
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
07.05.2012, 23:54 6
В запросе метода Fill обязательно должно быть ключевое поле
0
0 / 0 / 0
Регистрация: 07.05.2012
Сообщений: 13
08.05.2012, 10:35 7
Заполняю datagridview заказов (Order). В бд в таблице Order ключевое поле - OrderID, поле для связи с заказчиком данного заказа - ClientsClientsID (автоматически создалось при создании связи), в таблице Clients ключевое поле - ClientsID.

Мой запрос:
T-SQL
1
2
3
SELECT        OrderSet.OrderID, OrderSet.Date, OrderSet.ClientsClientsID, OrderSet.Status, OrderSet.Service, ClientsSet.FIO
FROM            OrderSet INNER JOIN
                         ClientsSet ON OrderSet.ClientsClientsID = ClientsSet.ClientsID
Необходимо сделать вот так? :
T-SQL
1
2
3
SELECT        OrderSet.OrderID, OrderSet.Date, OrderSet.ClientsClientsID, OrderSet.Status, OrderSet.Service, ClientsSet.FIO, ClientsSet.ClientsID
FROM            OrderSet INNER JOIN
                         ClientsSet ON OrderSet.ClientsClientsID = ClientsSet.ClientsID
0
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
08.05.2012, 10:39 8
Sidewalker, еще одним обязательным моментом для автоматического создания запросов является выборка только с одной(!) таблицы. В данном случае только один выход - прописывать запросы вручную.
0
0 / 0 / 0
Регистрация: 07.05.2012
Сообщений: 13
08.05.2012, 10:44 9
У меня на форме для создания заказов есть кнопки создать новый и удалить выделенный. Так вот создание нового (а значит и InsertCommand, да?) работает, ничего не трогал. А удаление нет. Как и где прописать DeleteCommand?
0
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
08.05.2012, 10:47 10
Как в одном DataGridView вывести данные из нескольких таблиц
0
0 / 0 / 0
Регистрация: 07.05.2012
Сообщений: 13
08.05.2012, 10:56 11
У меня не выходит никакого сообщения об ошибке, раньше удалял через DeleteOrderById, теперь эта функция не сгенерировалась (не найдена функция...), попробовал через orderSetBindingSource.RemoveCurrent() [так вроде работает ведь? когда строка таблицы выделена]..
0
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
08.05.2012, 11:02 12
Sidewalker, тебе нужно удаление из DataGridView или из DataTable?
0
0 / 0 / 0
Регистрация: 07.05.2012
Сообщений: 13
08.05.2012, 11:06 13
Из DataGridView и из БД
0
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
08.05.2012, 11:25 14
тогда объясняю еще раз.
при удалении строки из dgv, в DataTable эта строка получает RowState= Deleted.
при необходимости передать изменения в БД вызывается метод Update для адаптера связанного с этой DataTable. Адаптер перебирает строки в источнике, и на основании состояния RowState принимает решение какой запрос (InsertCommand,UpdateCommand, DeleteCommand) выполнить для текущей строки. Таким образом, для нормальной работы адаптера необходимо настроить эти команды.
1
0 / 0 / 0
Регистрация: 07.05.2012
Сообщений: 13
08.05.2012, 11:29 15
Понял примерно, но где их настраивать? Есть ли какой-нибудь wizard как для метода Fill?
Если нет, то в каком файле писать код, и какой примерно?
0
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
08.05.2012, 12:13 16
Цитата Сообщение от Sidewalker Посмотреть сообщение
Есть ли какой-нибудь wizard как для метода Fill?
мастера нет
, доступно при редактировании Dataset в дизайнере, смотри свойства адаптера. Либо можно динамически в коде определять эти свойства для адаптера
1
0 / 0 / 0
Регистрация: 07.05.2012
Сообщений: 13
08.05.2012, 12:33 17
Цитата Сообщение от nio Посмотреть сообщение
доступно при редактировании Dataset в дизайнере, смотри свойства адаптера
это нашёл, для DeleteCommand запустил мастера (имею в виду построитель запросов), а как прописать SQL-команду чтобы удалить текущую (выбранную в dgv) строку из таблицы Order? Типа как
C#
1
where OrderID=dgv.SelectedRows[0]
.
Он по умолчанию в построителе прописал
SQL
1
DELETE  FROM OrderSet ON
, но это затронет все записи.
0
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
08.05.2012, 13:42 18
Sidewalker, сделай сначала адаптер для одной таблицы, посмотри, как запросы строятся автоматически, как при этом организованы параметры и связь со столбцами, и сделай по аналогии.
1
0 / 0 / 0
Регистрация: 07.05.2012
Сообщений: 13
08.05.2012, 14:05 19
Хм, логично, чёт я не догадался, извиняюсь)

Написал так:
SQL
1
2
DELETE FROM OrderSet
WHERE        (OrderID = @Original_OrderID)
Ну и параметр @Original_OrderID руками добавил.

вопросы:
1) достаточно будет, если я передаю только один параметр? (в адаптере для одной таблицы передаются несколько параметров, но это было прописано автоматически, а ключ OrderID у каждой записи уникален, как впрочем и ClientsID)
2) Какую теперь функцию (возможно принимающую dataGridView2.SelectedRows[0] или dataGridView2.SelectedRows[0].Cells["OrderID"].Value) мне вызвать в коде моей кнопки, чтобы как раз была впоследствии неявно вызвана команда deleteCommand?

Добавлено через 10 минут
Попробовал вот так делать https://www.cyberforum.ru/post2408513.html
C#
1
dataSetX.OrderSet.Rows.Remove(dataSetX.OrderSet.FindByOrderID(Convert.ToInt32(dataGridView2.SelectedRows[0].Cells["OrderID"].Value)));
Пишет что не найден столбец OrderID. Он в dgv есть, но Visible=False. Я чёт не понял.. Вроде он есть же, просто не отображается, почему студия не может сообразить что его ячейка присутствует в выделенной строке? (ну или взять номер выделенной строки и взять с таким же номером ячейку из столбца OrderID)
0
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
08.05.2012, 14:07 20
Цитата Сообщение от Sidewalker Посмотреть сообщение
достаточно будет, если я передаю только один параметр?
я думаю да. Все зависит от того сколько пользователей у программы. Автоматически созданный запрос проверяет все поля записи для обеспечения целостности данных при одновременной работе с данными нескольких пользователей (защищает от возникновения критических ситуаций, когда разные пользователи редактируют одну и ту же запись)
Цитата Сообщение от Sidewalker Посмотреть сообщение
Какую теперь функцию мне вызвать в коде моей кнопки, чтобы как раз была впоследствии неявно вызвана команда deleteCommand?
adapter.Update, там перегрузок много, выбирай любую
1
08.05.2012, 14:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2012, 14:07
Помогаю со студенческими работами здесь

Нужно, чтобы при выборе элемента в одном DataGridView отображались связанные данные в другом DataGridView
Есть две связанные таблицы и соответственно два DataGridView, нужно, чтобы при выборе элемента в...

Отображение разных таблиц из БД в одном dataGridView
всем доброго времени суток! есть БД, dataGridView на форме. в конструкторе в dataGridView через...

Создание нескольких таблиц в одном отчете reportviewer
Все здравствуйте. Только начал изучать reportviewer и тут такая засада. Необходимо создать отчет...

В одном DataGridView выводить столбцы из двух связанных таблиц из БД
Привет, у меня есть база данных, объектная модель данных, через которую получаю данные с БД, нужно...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru