Raymond Bouissou Ответов: 0

Как мне синхронизировать ? : 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
Раймонд

0 Ответов