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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DataGridView отображение двух связанных таблиц, как сделать? не получается 
V
    Опции темы
Экскалупатор
Дата 10.7.2009, 07:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



есть DataSet в котором есть две таблицы и отношение между ними один ко многим. Я хочу отобразить в одном DataGridView данные из этих таблиц, что бы на каждую запись основной табилицы показывались данные из связанной. Таблицы: "Question" и "Answer" и отношение "relation". 
читал вот эту тему
но ничего у меня не работает, отображается только одна таблица, а связанная не отображается. пишу так:
Код

DataSet charactDataSet = new DataSet();
            charactDataSet = datawork.Characteristics();
            dataGridView1.DataSource = charactDataSet.DefaultViewManager;
            dataGridView1.DataMember = "Question";

Dataset заполняется так(DataWorking класс работающий с базой, это его метод):
Код

public DataSet Characteristics()
        {
            DataSet ds = new DataSet();
            using (OleDbConnection connect = new OleDbConnection(connectionString))
            {
                OleDbCommand Select_comand = connect.CreateCommand();
                Select_comand.CommandText = "SELECT * FROM Question";
                OleDbDataAdapter CharactetisticsDataAdapter = new OleDbDataAdapter(Select_comand);
                CharactetisticsDataAdapter.TableMappings.Add("Table", "Question");
                CharactetisticsDataAdapter.Fill(ds);
                Select_comand.CommandText = "SELECT * FROM Answer";
                CharactetisticsDataAdapter = new OleDbDataAdapter(Select_comand);
                CharactetisticsDataAdapter.TableMappings.Add("Table", "Answer");
                CharactetisticsDataAdapter.Fill(ds);

                ds.Relations.Clear();
                ds.Relations.Add("relation", ds.Tables["Question"].Columns["Id_Question"], ds.Tables["Answer"].Columns["Id_Question"]);
            }
            return ds;
        }


подскажите в чем ошибка, а то я что то уже замучился. smile , заранее спасибо.

Это сообщение отредактировал(а) Экскалупатор - 10.7.2009, 07:16
PM MAIL ICQ   Вверх
diadiavova
Дата 10.7.2009, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



А почему не добавить в DataSet объединённую таблицу  и отображать её? Так ведь проще.
Что-то типа
Код

SELECT * FROM Question INNER JOIN Answer ON Question.question_id = Answer.question_id




--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Экскалупатор
Дата 10.7.2009, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



diadiavova, м-м-м, а как будет это отображено? дело в том что у меня один вопрос и много ответов, т.е. удобно было бы сделать что бы можно было нажать на плюсик рядом с вопросом и открывался список ответов к этому вопросу. а если объединенно то так не получиться(наверное).
PM MAIL ICQ   Вверх
diadiavova
Дата 10.7.2009, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Ну насчёт плюсиков не знаю, вроде есть такая возможность, но как это работает я не в курсе. Можно сделать, чтобы вопрос отображался несколько раз, тогда, конечно понадобиться внешнее объединение, а не внутреннее. Но если у тебя что-то типа теста, то может грид - не самый оптимальный вариант?

Добавлено через 5 минут и 43 секунды
Да, я чойт ступил, мне показалось, что у тебя написано "связь один к одному"


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
diadiavova
Дата 10.7.2009, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Код

SELECT * FROM Question LEFT OUTER JOIN Answer ON Question.question_id = Answer.question_id
ORDER BY Question.question

Поправил запрос, сортируется по гипотетическому полю question таблицы Question  smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Экскалупатор
Дата 10.7.2009, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



diadiavova, у меня не тест, суть задачи такова: есть программа для составления характеристик, в программе есть список вопросов и ответов к ним, выбирая которые пользователь будет составлять характеристику, это сама прога. а то что я хочу сделать это редактор этих самых вопросов и ответов, т.е. пользователь заходит в редактор и может тут добавлять вопросы и ответы, а так же выставлять как бы статус вопросов и ответов, если например напротив вопроса стоит true то вопрос будет задаваться в процессе создания характеристики, а если false то нет, с ответами тоже самое. я думаю что объединенный DataGridView подходит для этого дела просто замечательно. сейчас у меня это работает через два DataGridView, т.е. в одном выбираешь вопрос, а во втором отображается список ответов к нему, но это как то не красиво выглядит и не совсем удобно, хочется в одном. ну или предложите как по другому сделать...

поправлюсь:
поправлюсь в базе много вопросов и много ответов, вопросы и ответы можно добавлять

Это сообщение отредактировал(а) Экскалупатор - 10.7.2009, 14:15
PM MAIL ICQ   Вверх
diadiavova
Дата 10.7.2009, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Грид можно и один использовать. У него есть свойство DataMember, переключая которое, можно выбирать отображаемую таблицу. Структура данных в дэйтасете не обязательно должна совпадать со структурой базы. Можно туда добавить результаты различных запросов, в том числе и объединяющих и отображать всё это в одном гриде.

Добавлено через 52 секунды
Не одновременно ессно, но сделать всё можно очень удобно.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Экскалупатор
Дата 10.7.2009, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



не, мне кажется будет лучше что бы сразу, но я подумаю.

Добавлено через 2 минуты и 30 секунд
мне уже больше для себя стало интересно, ведь наверняка как то можно, и скорее всего что очень просто так сделать, но вот как именно просто...
PM MAIL ICQ   Вверх
diadiavova
Дата 10.7.2009, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(Экскалупатор @  10.7.2009,  14:50 Найти цитируемый пост)
мне уже больше для себя стало интересно

Ну если дело в этом, то ищи smile , а если для дела, то ИМХО - лучше взять какой-нибудь комбобокс(прямо в тулбае) пусть он выводит список доступных таблиц, а когда пользователь выбирает нужную, то её имя просто передаётся свойству DataMember грида и дело в шляпе smile 



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
SKrivosein
Дата 11.7.2009, 04:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

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



ошибка

Это сообщение отредактировал(а) SKrivosein - 11.7.2009, 04:39


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
diadiavova
Дата 11.7.2009, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(diadiavova @  10.7.2009,  13:46 Найти цитируемый пост)
Ну насчёт плюсиков не знаю, вроде есть такая возможность

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

Это сообщение отредактировал(а) diadiavova - 11.7.2009, 12:09

Присоединённый файл ( Кол-во скачиваний: 43 )
Присоединённый файл  ConjTables.rar 129,13 Kb


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Экскалупатор
Дата 11.7.2009, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



diadiavova, спасибо. вот это уже ближе к тому что мне хочется. только он как то странно отображает сначала связь, а потом уже данные по связи, надо что бы сразу отображал связанные данные и не в новой таблице, а одновременно со основными данными. как например Access делает, когда у него есть связанные таблицы.
PM MAIL ICQ   Вверх
diadiavova
Дата 11.7.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Ну есть там вроде такая фича, но как её замутить я не в курсе. Помню работал ещё с версией 2003 года и тогда как мне помнится вытащил откуда-то из файлов винды большой XML документ и отобразил его в гриде и вот он по-моему отображался как тебе надо, но уверенности нет, возможно это студия его так отображала(тогда в студии был такой дизайнер хмл-а). Сейчас точно уже не помню, так что, обнадёживать не буду.
Вот можешь тут поискать инфу
http://rsdn.ru/article/dotnet/datagridfaq.xml
http://rsdn.ru/article/dotnet/DataGridView20.xml
http://rsdn.ru/article/dotnet/DataGridView20part2.xml
Про старый грид там неплохая статья(первая ссылка вроде бы)


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Экскалупатор
Дата 11.7.2009, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



нашел вот такую инфу, как сделать что бы не отображалось название связи, а сразу открывались дочерние данные:
Цитата

Как сделать, чтобы в DataGrid'e по щелчку на "+" сразу появлялись строки дочерней таблицы, а не сначала название связи и только потом после щечка на имени связи появляются строки дочерней таблицы?

При нажатии на '+' инициируется событие DataGrid.NodeClick, но т. к. оно не public, чтобы 'подписаться' на него нужно использовать Reflection:

Код

EventInfo eventInfo = typeof(DataGrid).GetEvent("NodeClick", BindingFlags.NonPublic | BindingFlags.Instance); 
MethodInfo methodInfo = eventInfo.GetAddMethod(true); 
methodInfo.Invoke(dataGrid1, new object[]{new EventHandler(OnNodeClick)});


Также, для того чтобы вернуться при клике на кнопку DataGrid'a back (стрелочка, указывающая влево) на родительскую строку, необходимо подписаться на событие DataGrid.BackButtonClick:

Код

dataGrid.BackButtonClick += new EventHandler(OnBackButtonClick);


Внутри обработчика NodeClick нужно вызвать DataGrid.NaviageTo(), указав номер строки и имя Relation'a. Номер строки, на которой кликнули, можно узнать, например, при помощи DataGrid.HitTest:

Код

void OnNodeClick(object sender, EventArgs e) 

 DataGrid dataGrid = (DataGrid)sender; 
 Point cursorPosition = dataGrid.PointToClient(new Point(Cursor.Position.X, Cursor.Position.Y)); 
 DataGrid.HitTestInfo hitInfo = dataGrid.HitTest(cursorPosition); 
 dataGrid.NavigateTo(hitInfo.Row, RELATION_NAME);
}


И обработчик кнопки возврата:

Код

void OnBackButtonClick(object sender, EventArgs e)
{
 ((DataGrid)sender).Collapse(-1);
}


источник тут.

почти все что нужно, если бы не отображение отдельно разных таблиц, т.е. сначала основных данных, а потом связанных, но уже лучше чем ничего, буду искать дальше.
PM MAIL ICQ   Вверх
diadiavova
Дата 11.7.2009, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



В DataGrid'е за отображение отвечают стили: таблиц, колонок итд. Даже логика прорисовки самого грида зашита в них. Так что если в них серьёзно покопаться, то теоретически можно получить любые эффекты. Только чойт мне кажется, что "овчинка выделки не стоит". Чисто для себя, чтобы разобраться как устроен грид это даже полезно, там много чего интересного, но пихать такую трахомбу в прогу я бы не стал smile


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


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

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




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


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

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