Как мне синхронизировать ? : ADO.NET : master/detail - WPF detail datagrid стирается при событии rowupdated
VS2015 - WPF - ADO.NET -ДОСТУП
Я сталкиваюсь с блокирующим поведением при совершении нового заказа для клиента в отношениях Master/Details через две DataGrid.
Когда я добавляю клиента в последней пустой строке Главного управления DataGrid, а затем добавить, что для поддержки порядка в подробности DataGrid на последней пустой строке управления, на совершение событий с помощью кнопки "Сохранить", программа удаляет содержимое детали объекта DataGrid despate тот факт, что заказы DataView и объекта DataTable приняли в связи добавленный ребенка подряд.
Я следую по пути выполнения и выясняю, что проблема связана с правилом каскадного обновления TableAdapter таблицы customers, когда обновление происходит для того, чтобы присвоить идентификатор клиента ключу foreigner дочерней строки заказа в событии RowUpdated.
Перед выполнением фазы фиксации
https://www.developpez.net/forums/attachments/p285711d1497481807/dotnet/developpement-windows/windows-presentation-foundation/wpf-ado-net-effacement-commandes-consolidation-7/capture-.png
Во время фазы фиксации
https://www.developpez.net/forums/attachments/p285715d1497481833/dotnet/developpement-windows/windows-presentation-foundation/wpf-ado-net-effacement-commandes-consolidation-7/capture-pendant.png/
После совершения
https://www.developpez.net/forums/attachments/p285719d1497481862/dotnet/developpement-windows/windows-presentation-foundation/wpf-ado-net-effacement-commandes-consolidation-7/capture-apres.png/
Я действительно не знаю, как решить эту проблему, закончив поиск полезных ссылок в интернете:
https://stackoverflow.com/questions/24147924/wpf-master-details-new-data-disappears-from-datagrid
https://connect.microsoft.com/VisualStudio/feedback/details/538103/wpf-dataset-master-detail-binding-issue
Код строки обновленного метода :
private void dataadapterClients_RowUpdated(object sender, OdbcRowUpdatedEventArgs args) { if (args.RecordsAffected > 0) { if (args.StatementType == StatementType.Insert) { Console.WriteLine("[DBWpf, ClientsTableAdapter] dataadapterClients_RowUpdated, Attibue un numero d'ordre au client nouvellement cree"); OdbcCommand cmdIdentity = new OdbcCommand("SELECT @@IDENTITY", args.Command.Connection); cmdIdentity.Transaction = Transaction; Console.WriteLine("[DBWpf, ClientsTableAdapter] dataadapterClients_RowUpdated, Avant numerotation automatique du client"); int id = (int)(cmdIdentity.ExecuteScalar()); Console.WriteLine("[DBWpf, ClientsTableAdapter] dataadapterClients_RowUpdated, Client_ID : " + id); args.Row.Table.Columns["Client_ID"].ReadOnly = false; args.Row.Table.DataSet.Tables["Commandes"].Columns["Client_ID"].ReadOnly = false; MessageBox.Show("Stop ??????????????????"); args.Row["Client_ID"] = id; args.Row.Table.Columns["Client_ID"].ReadOnly = true; args.Row.Table.DataSet.Tables["Commandes"].Columns["Client_ID"].ReadOnly = true; Console.WriteLine("[DBWpf, ClientsTableAdapter] dataadapterClients_RowUpdated, Apres numerotation automatique du client"); } if (args.StatementType == StatementType.Insert || args.StatementType == StatementType.Update) { Console.WriteLine("[DBWpf, ClientsTableAdapter] dataadapterClients_RowUpdated, Recuperation de l'horodatage de la ligne client. Type d'ordre : " + args.StatementType); int intCriteria = 0; if (args.StatementType == StatementType.Insert) intCriteria = (int)args.Row["Client_ID"]; else intCriteria = (int)args.Row["Client_ID", DataRowVersion.Original]; OdbcCommand cmdStamp = new OdbcCommand("SELECT Stamp FROM Clients WHERE Client_ID = " + intCriteria, args.Command.Connection); cmdStamp.Transaction = Transaction; Console.WriteLine("[DBWpf, ClientsTableAdapter] dataadapterClients_RowUpdated, Avant ExecuteScalar"); DateTime dteStamp = (DateTime)(cmdStamp.ExecuteScalar()); // DateTime.Now Console.WriteLine("[DBWpf, ClientsTableAdapter] dataadapterClients_RowUpdated, Horodatage : " + dteStamp); args.Row.Table.Columns["Stamp"].ReadOnly = false; args.Row["Stamp"] = dteStamp; args.Row.Table.Columns["Stamp"].ReadOnly = true; // true } } else { // args.Row.RowError = "Conflit d'acces concurrentiel optimiste rencontre"; // Concurrency Violation Encountered // args.Status = UpdateStatus.SkipCurrentRow; } }
Проблема возникает при выполнении инструкции, которая следует за MessageBox.Show (), который инициализирует идентификатор вновь добавленного клиента и предлагает обновление (Каскад правил обновления) дочерней строке.
MessageBox.Show("Stop ??????????????????"); args.Row["Client_ID"] = id;
"TwoWay Binding" WPF должен обновить пользовательский интерфейс, но в этом случае содержимое Details DataGrid стирается.
Вот почему я хотел бы дать здесь ссылку для скачивания моего проекта, чтобы вы точно увидели проблему, выполнив написанное мной приложение, и, возможно, смогли бы найти решение моей проблемы.
https://drive.google.com/file/d/0B64EJCynJGIza1J1ZF9PcTNKTHM/view?usp=sharing
Спасибо за вашу помощь
.
Что я уже пробовал:
https://social.msdn.microsoft.com/Forums/en-US/261c9f33-9afe-4549-b7cb-5b638741d5ce/adonet-masterdetail-wpf-detail-datagrid-erased-on-rowupdated-event?форум=netfxbcl
Raymond Bouissou
Всем привет,
Вот последние новости из службы поддержки Microsoft : https://connect.microsoft.com/VisualStudio/feedback/details/3136661/ado-net-master-detail-wpf-detail-datagrid-erased-on-rowupdated-event
Раймонд