powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как передать DataRow в другую форму/Dataset для редактирования
12 сообщений из 12, страница 1 из 1
Как передать DataRow в другую форму/Dataset для редактирования
    #36526611
eugenehr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Долгое время писал на Delphi, а сейчас подумываю перейти на C#. Понимание приходит, но с трудом - слишком разные технологии доступа к данным.
Разбираюсь с тестовой базой Northwind . Мастер мне сделал типизированный Dataset (NorthwindDataSet), содержащий 2 таблицы: Orders и [Order Details] , связанные внешним ключом. В приложение добавил 2 формы: frmOrders, отображающую только список заказов, и frmCard - для добавления/редактирования заказа. В каждой форме есть экземпляр NorthwindDataset.

Карточку открываю по нажатию одной из кнопок и передаю ей соотв. заказ:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
private void btnOpen_Click(object sender, EventArgs e)
{
    if (bsOrders.Current == null)
        return;

    NorthwindDataSet.OrdersRow orderRow = 
        (NorthwindDataSet.OrdersRow)((DataRowView)bsOrders.Current).Row;
    using (frmCard cardForm = new frmCard(orderRow))
    {
        cardForm.ShowDialog();
    }
}

private void btnAdd_Click(object sender, EventArgs e)
{
    NorthwindDataSet.OrdersRow 
        orderRow = dsNorthwind.Orders.NewOrdersRow();
    using (frmCard cardForm = new frmCard(orderRow))
    {
        DialogResult res = cardForm.ShowDialog();
        ...
    }
}
NorthwindDataSet в реестре содержит только шапки заказов. В карточке я хотел переданный заказ поместить в локальный экземпляр NorthwindDataset, в таблицу Orders, и только для этого заказа подтянуть из базы его содержимое, чтобы можно было использовать внешний ключ, созданный мастером. Но поскольку DataRow, созданную одним DataSet-ом, нельзя включить в другой, то не понимаю как быть.
Вариантов видится 3:
1. Передавать в карточку только OrderID и выбирать заказ по-новой, а после редактирования обновлять реестр;
2. Передавать в карточку ссылку на нужную DataRow (как делаю сейчас) + ссылку на DataSet из реестра. В этом DataSet-е выбирать содержимое заказа, а при закрытии чистить его;
3. Не использовать внешний ключ в карточке и обрабатывать каскадные изменения вручную.

Может в C# делается совсем по-другому? Поделитесь сокровенными знаниями.
PS: Ни Linq, ни EF, мне пока не интересны.

-----
С уважением
...
Рейтинг: 0 / 0
Как передать DataRow в другую форму/Dataset для редактирования
    #36526624
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eugenehr
Даже не заморачивайтесь с типизированными датасетами - сломаете мозг от этого г... ((тем более Вы только начинаете изучать .NET))
P.S. Смотрите в сторону ORM: Entity Framework, Linq to SQL, NHibernate
...
Рейтинг: 0 / 0
Как передать DataRow в другую форму/Dataset для редактирования
    #36526662
eugenehr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МСУСмотрите в сторону ORM До этого мне пока далеко. Да и для полноты картины с Dataset-ами разобраться все же хочется.
...
Рейтинг: 0 / 0
Как передать DataRow в другую форму/Dataset для редактирования
    #36526812
curiousMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообще вопрос у вас скорее не о DataSet'ах, а об архитектуре приложения. Может вам лучше для начала об многоуровневой архитектуре почитать что-нибудь, чтобы не смешивать UI и код доступа к данным и не привыкать к плохому.
...
Рейтинг: 0 / 0
Как передать DataRow в другую форму/Dataset для редактирования
    #36526832
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
curiousManМожет вам лучше для начала об многоуровневой архитектуре почитать что-нибудь, чтобы не смешивать UI и код доступа к данным и не привыкать к плохому.
Т-tier architecture тут не при чём. Топиккастер может вполне себе работать с двухзвенкой и не заморачиваться. Двуххвенка - это не "плохое", это - архитектура.
Если Вы имели ввиду разделение на слои UI и DAL - то типизированные датасеты вполне себе могут содержаться в DAL и они будут обвязаны по классам.
P.S. Я не нахожу содержательным Ваш ответ, который еще более путает топиккастера.

eugenehrМСУСмотрите в сторону ORM До этого мне пока далеко. Да и для полноты картины с Dataset-ами разобраться все же хочется.
Не так страшен чёрт, как его малюют. Почитайте форум, посмотрите что люди спрашивали. За день-два у Вас всё более или менее уляжется в голове, главное желание.
P.S. А с типизированными датасета завязывайте, серьезно.
...
Рейтинг: 0 / 0
Как передать DataRow в другую форму/Dataset для редактирования
    #36526848
curiousMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если по существу, то держать отдельный экземпляр DataSet в каждой форме не нужно. Контекст данных же у вас один, вот один и используйте. Если хочется держать данные в форме, то способов масса - передать ссылку на экземпляр DataSet в конструкторе, запихать его в синглтон, внедрять зависимость и т.д. Правильность зависит только от задачи, которую решаешь.
...
Рейтинг: 0 / 0
Как передать DataRow в другую форму/Dataset для редактирования
    #36526923
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
curiousManА если по существу, то держать отдельный экземпляр DataSet в каждой форме не нужно. Контекст данных же у вас один, вот один и используйте. Если хочется держать данные в форме, то способов масса - передать ссылку на экземпляр DataSet в конструкторе, запихать его в синглтон, внедрять зависимость и т.д. Правильность зависит только от задачи, которую решаешь.
однозначно +1
...
Рейтинг: 0 / 0
Как передать DataRow в другую форму/Dataset для редактирования
    #36526947
eugenehr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
curiousMan...многоуровневой архитектуре...запихать его в синглтон, внедрять зависимость и т.д....Возможно я неправильно задал вопрос. Возможно пытаюсь перетащить курсоры Delphi на C#. Не знаю.
Что я делаю в Delphi (чаще всего). Во-первых минимизировать лишние обращения к БД (специфика наших проектов). Во-вторых - писать по-меньше подверженного ошибками кода.
Тот же Northwind, но на Delphi.

1. Форма "Реестр заказов". Один источник данных, содержащий только заказы. Кнопки "Создать" и "Открыть".
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 procedure  TOrdersReestrForm.btnOpenClick(Sender: TObject);
 begin 
     //т.к. в Delphi нельзя одновременно обращаться к нескольким строкам таблицы, то по сути в форму передается только текущая строка 
    TOrdersCardForm.OpenOrder(qryOrders);  //qryOrders потомок TDataset, содержащий список заказов  
 end ;
 procedure  TOrdersReestrForm.btnAddClick(Sender: TObject);
 begin 
    qryOrders.Append;  //добавляет новую строку и позиционируется на нее 
    TOrdersCardForm.OpenOrder(qryOrders);    
 end ;
2. Карточка заказа. 2 источника данных - первый(Заказ) передается из реестра, второй(Содержимое заказа) - живет в этой форме и привязывается к первому, используя внешний ключ
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 class   procedure  TOrdersCardForm.OpenOrder(qryOrder: TDataset);
 begin 
     with  TOrdersCardForm.Create(Application)  do 
     try 
        dsOrder.Dataset := qryOrder;   //dsOrder: TDatasource. Содержит ссылку на таблицу заказов. 
        qryDetails.MasterSource := dsOrder;
        qryDetails.MasterFields := 'OrderID';  //первичный ключ из таблицы Orders 
        qryDetails.DetailFields := 'OrderID';  //поле связи в таблице [Order Details] 
        
         //При открытии qryDetails будет содержать только строки из текущего заказа 
         //Также при добавлении новых строк значение поля OrderID будет заполняться автоматически  
        qryDetails.Open;

        ShowModal;  //открывается карточка в модальном режиме 
     finally 
        Free;  //Форма удаляется. Также удаляется и таблица, содержащая документостроки текущего заказа 
     end ;
 end ;
В результате, после закрытия карточки в БД будут отправлены только изменения, без перевыборки их обратно.

PS: Знаю, что программисты на Delphi не любят писать ручками. Но чем меньше кода, тем меньше и ошибок. Мне так всегда казалось.
PPS: curiousMan, МСУ. Если я правильно понял, то нужно передавать в карточку ссылку на DataSet из реестра. В карточке, в этом DataSet-е, заполнять подчиненную таблицу, а при выходе чистить ее?
...
Рейтинг: 0 / 0
Как передать DataRow в другую форму/Dataset для редактирования
    #36527598
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eugenehrЕсли я правильно понял, то нужно передавать в карточку ссылку на DataSet из реестра.
Как вариант, да.
eugenehrВ карточке, в этом DataSet-е, заполнять подчиненную таблицу, а при выходе чистить ее?
В каком смысле чистить? В плане очистки ресурсов, что-ли? Ничего чистить не нужно, Garbage Collector сам с этим справится.
P.S. Я рекомендую Вам сначала прочитать книжку (литература обсуждается постоянно на форуме WinForms, .Net Framework), а не бросаться на амбразуру.
...
Рейтинг: 0 / 0
Как передать DataRow в другую форму/Dataset для редактирования
    #36528226
eugenehr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МСУВ каком смысле чистить? В плане очистки ресурсов, что-ли? Ничего чистить не нужно, Garbage Collector сам с этим справится.В том смысле, что при выходе из карточки и подтверждения изменений в БД, содержимое заказа больше не нужно. Если не чистить эту таблицу и последовательно открыть десяток заказов, то их количество будет довольно большим и бесполезно занимать память.
МСУЯ рекомендую Вам сначала прочитать книжку (литература обсуждается постоянно на форуме WinForms, .Net Framework), а не бросаться на амбразуру.Этим и занимаюсь. Беда в том, что книги описывают ADO.NET отдельно от WinForms и наоборот. Толковых книг/примеров, где были бы эти 2 сущности вместе, найти пока не удалось.
...
Рейтинг: 0 / 0
Как передать DataRow в другую форму/Dataset для редактирования
    #36528300
curiousMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
eugenehrМСУВ каком смысле чистить? В плане очистки ресурсов, что-ли? Ничего чистить не нужно, Garbage Collector сам с этим справится.В том смысле, что при выходе из карточки и подтверждения изменений в БД, содержимое заказа больше не нужно. Если не чистить эту таблицу и последовательно открыть десяток заказов, то их количество будет довольно большим и бесполезно занимать память.
Этим и занимаюсь. Беда в том, что книги описывают ADO.NET отдельно от WinForms и наоборот. Толковых книг/примеров, где были бы эти 2 сущности вместе, найти пока не удалось.
Посмотри Self-Paced Training Kit MCTS 70-505 Windows Forms Application Development - там даются стандартные сценарии, причем расписанные по шагам.
...
Рейтинг: 0 / 0
Как передать DataRow в другую форму/Dataset для редактирования
    #36528316
eugenehr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
curiousManПосмотри Self-Paced Training Kit MCTS 70-505 Windows Forms Application Development - там даются стандартные сценарии, причем расписанные по шагам.Спасибо, буду искать.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как передать DataRow в другую форму/Dataset для редактирования
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]