![]() |
Модераторы: gambit |
![]() ![]() ![]() |
|
bagrintsev |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 26.11.2007 Репутация: нет Всего: нет |
Ребята кто знающий помогите пожалуйста новичку в ADO.NET
В акцессе была разработана база учета рабочих мест и техники. Две формы: в верхней запросом из разных таблиц собирается инфа о рабочих местах (редактируемый запрос: кабинеты+рабочие_места+ФИО+телефон+IP), в нижней - какая техника стоит на выделенном рабочем месте (таблица: устройства). Перемещаешь курсор по верхней форме - в нижней срабатывает фильтр и показывается только техника текущего рабочего места. Все легко редактируется и вообще очень удобно для учета. Никак не соображу как сделать то же самое в NET: (имеется в виду верхняя "форма" - датагрид, где должны быть данные из запроса. ) 1. то ли заливать в отдельные датасеты все используемые таблицы (кабинеты, ФИО и пр.), потом у клиента эти датасеты как то объединять запросом и вываливать в датагрид, там редактировать, а потом по отдельности обновлять записи для каждой таблицы (возможно ли это? - я имею в виду представление нескольких датасетов в виде другого датасета-запроса), 2. то ли заливать в отдельный датасет данные из нескольких таблиц (запросом) и редактировать их в датагриде (только как потом это дело обновлять ? Данные же из нескольких таблиц, а хранятся в одном датасете...) Сломал мозги раздумывая как нужно сделать. Наверняка эта тема уже давно обсосана и расписана, вот только сколько ни ищу никак не могу найти. Ткните в ссылку или подскажите плз Это сообщение отредактировал(а) bagrintsev - 9.1.2008, 14:02 |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 8 Всего: 232 |
Создать в проекте типизированный датасет, две таблицы ("верхняя" и "нижняя"), накидать колонок соотв-ющих тому что там выбирается запросом из БД. Добавить связь между таблицами: нижняя зависит от верхней по foreign key. После этого создаём пустую форму, тянем на неё наш типизированный датасет (DataSet с тулбокса), после чего добавляем два DataGridView и настраиваем их DataSource на две таблицы (главную и вложенную в неё). В коде зачитываем данные в датасет. В результате получаем форму с двумя гридами, при перемещении по первому гриду во втором отображаются связанные данные.
З.Ы, пример со скриншотом где-то был на форуме. -------------------- ![]() |
|||
|
||||
bagrintsev |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 26.11.2007 Репутация: нет Всего: нет |
mr.DUDA, спасибо за ответ.
так значит думаешь стоит брать данные для верхнего грида запросом в датасет? а как же обновлять? выбирать измененные строки, начинать дербанить их по полям (какое поле изменено и к какой таблице принадлежит), а потом создавать на этой основе сиквел-запросы? мда... трудоемко однако. даже и не знаю. в акцессе я об этом даже не задумывался. (да, и еще... у меня все кодом делается, динамически. и даже все уже работает - т.е. фильтруется. вот только с обновлениями никак не разберусь. ) |
|||
|
||||
thomas |
|
|||
![]() Доцент... почти ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1385 Регистрация: 3.10.2006 Где: " Сказочное королевство" Репутация: 35 Всего: 65 |
bagrintsev,
Привет. Выложи либо структуру таблиц либо саму базу и скажи на каком языке сделать. (VB или C#) Я вечерком с работы приду сделаю тебе проектик. -------------------- Крепко жму горло, искренне ваш Thomas. (С)vingrad Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну! Проблемы негров шерифа не волнуют. |
|||
|
||||
bagrintsev |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 26.11.2007 Репутация: нет Всего: нет |
thomas, огромное тебе спасибо.
я конечно постараюсь самостоятельно решить проблему, тем более что в опубликованном тобой классе dataAccess увидел похоже свет в конце туннеля - метод dbCmdBuilder.GetUpdateCommand() насколько я понимаю он строит sql-команды обновлений, главное дать ему таблицу но подсказки опытного чела всегда очень кстати. так как же сохранить изменения в датасете1? чего тут не хватает? вот код. Форма1, на форме три датагрида (DataGrid1 - 3), третий служебный - я на нем тренируюсь смотреть измененные строки, есть еще менюшка в верху, но она к делу не относится.
|
|||
|
||||
thomas |
|
|||
![]() Доцент... почти ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1385 Регистрация: 3.10.2006 Где: " Сказочное королевство" Репутация: 35 Всего: 65 |
bagrintsev,
Приветствую. Если я правильно понял, то у тебя в базе как минимум три связанных между собой таблицы: - первая содержит данные о кабинетах; - вторая содержит данные о рабочих местах в кабинетах; - третья содержит данные о технике на рабочих местах. Тебе нужен простой интерфейс что бы видеть в каком кабинете какие рабочие места и что на них(рабочих местах) стоит из техники. Предлагаю самый простой вариант. Создаешь новый проект. Открылось окно с формой. Идем в меню студии Data вибираем Add New Data Source ... и далее следуем шагам мастера: выбираем базу, создаем соединение, можно сохранить строку соединения в app.config(я обычно не сохраняю), выбираешь три свои таблицы и даешь наименование ДатаСету. Финишь. Студия создала в твоем проекте ДатаСет с тремя таблицами. В Solution Explorer увидишь нод имя твоего ДатаСет .xsd дважды жмем мышей, откроется окно дизайнера ДатаСет. В нем увидишь три свои таблицы. Если уже есть связи между ними, то ничего не делай. Если нет, то просто на свободном месте жмем правой кнопкой мыши и в контекстном сменю выбираем Add --> Relation ... . В диалоговом окне указываешь родительскую таблицу и ее первичный ключ, потом дочернюю и вторичный ключ(=первичному родительской). Жмем ОК. Повторяем процедуру для следующей пары таблиц. Связи созданы, получили три таблицы, которые связаны между собой: кабинет - рабочее место - техника. Далее открыли дизайнер формы, справа будет окно DataSources, там видим наш ДатаСет, а в нем три наших таблицы. Так вот жмем плюсик рядом с таблицей кабинет, видим поля этой таблицы и связанную сней таблицу рабочие места. Жмем на ее плюсик и видим ее поля и связанную с ней таблицу техника. Теперь осталось только определиться что и как показывать на форме. Предлагаю следующее. Для таблицы кабинет выбрать представление детали , для этого выделить таблицу мышей и слева нажав на стрелочку вниз в выпадающем списке выбрать Details. Для каждого поля этой таблицы можно выбрать тип контрола в котором ты хочешь видеть соответствующие данные или же если ты не хочешь видеть на форме это поле, то выбираешь просто [None]. Для двух других таблиц можно оставить представление DataGridView. Теперь внимание: первым делом тащим на форму таблицу кабинеты, просто выделили мышей название и перетащили на форму. Студия сама создаст и отобразит на форме выбранные тобой для полей таблицы контролы + BindingNavigator для этой таблицы. Размещаешь контролы как тебе нравиться на форме. Потом выделяешь таблицу рабочих мест и тянешь ее на форму. Размещаешь созданный студией DataGridView там где надо. Если необходимо убрать лишние колонки(не отображать некоторые поля таблицы), то в правом верхнем углу жмем на стрелочку и в меню выбираем Edit Columns... . В диалоговом окне удаляем лишние поля(можно и добавить, типа вычисляемые поля), задаем свойства оставшимся если надо. И Жмем ОК. Теперь проведем туже процедуру с таблицей техника. Все интерфейс готов. Студия сгенерила и поместила на форму меобходимые контролы: дата сет, биндинг навигатор, и три пары биндинг соурс + табле адаптер для каждой из таблиц. Теперь открываем вкладку код для твоей формы. Студия сгенерила код события загрузки формы. Там ты видишь что для трех табле адаптеров вызывается метод Fill(). Расположи их в последовательности: кабинет, рабочее место, техника. (а то студия их расположила в алфавитном порядке) Надо чтобы первой заполнялась родительская таблица а потом ее дочерняя. Поменял, все данные загрузятся как нужно. Теперь надо позаботиться о сохранении данных в БД. Студия сгенерировала код для события нажать на кнопку сохранить в биндинг навигаторе. Но сделала она это только для главной таблицы - кабинеты. Значит нам надо добавить еще четыре строчки кода(по две на каждую из оставшихся таблиц) вызвать метод EndEdit() для соответствующего Binding Source и вызвать метод Update() для соответствующего табле адаптера, в качестве параметра передав твой дата сет и соответствующую таблицу в нем. Все. Жми F5 и запускай приложение. При старте увидишь детальное отображение данных на кабинеты, навигация по кабинетам через стрелки на навигаторе. Кнопка плюс очисти все контролы и предоставит возможность внести данные на новый кабинет. Далее кнопка сохранить сохранит(добавит) внесенные в контролы данные на новый кабинет в базу данных. Кнопка удалить - удалит текущий рекорд из БД. Какие рабочие места есть в текущем кабинете отобразит первый грид. А что установлено на выделенном в первом гриде рабочем месте отобразит второй грид. Соответственно ты можешь редактировать, добавлять или удалять данные о рабочих местах и технике на них прямо в гридах. Все эти изменения вступят в силу(попадут в базу) при нажатии кнопки сохранить на навигаторе. Вот собственно и все. ![]() -------------------- Крепко жму горло, искренне ваш Thomas. (С)vingrad Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну! Проблемы негров шерифа не волнуют. |
|||
|
||||
bagrintsev |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 26.11.2007 Репутация: нет Всего: нет |
Вот это да! Я в шоке! И практически никакого кода!
Я попробовал сделать все по твоим указаниям - и за 5 минут практически готовый проект. И никакого утомительного застирывания! Я то привык все в блокнотике делать, каждую строчку кода рожать в потугах мозга и чтении бесконечных мануалов... А тут - пара движений мышкой, 10 строчек кода и все готово... Единственно что смущает - немного не подходит мне предложенный тобой вариант с разделением каждой таблицы в своем представлении (датагриде или листбоксе). Мне хотелось бы чтобы кабинеты , рабочие места , имена и должности находились в одном единственном датагриде - юзверей то у меня около трех сотен, замучаешься листать кабинеты, потом рабочие места, чтобы выискать нужного юзверя или его айпишник. Нет ли у тебя мыслей как сделать то же самое, но в одном объединенном датагриде? Это сообщение отредактировал(а) bagrintsev - 10.1.2008, 16:21 |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 8 Всего: 232 |
thomas, монстр!!!
![]() -------------------- ![]() |
|||
|
||||
bagrintsev |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 26.11.2007 Репутация: нет Всего: нет |
Хотел вот поблагодарить thomasа за искреннее участие и помощь в обучении и просвещении основам NET - добавить единичку в репутацию. А сервер говорит - для этого нужно сделать 100 постов.
![]() Я так понимаю, что мне нужно задать thomasу еще 97 разных вопросов? Трудная задача. Сижу вот, вопросы придумываю... ![]() |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 8 Всего: 232 |
bagrintsev, Томас заслуженно получил 2 плюса, так что не переживай
![]() -------------------- ![]() |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Базы данных под .NET | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |