none
Отслеживание изменений LINQ to SQL + WPF RRS feed

  • Вопрос

  •         private void dispatcherTimer_Tick(object sender, EventArgs e)
            {
                int position = customerViewSource.View.CurrentPosition;
                TestLinq1DataContext.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, customers);
                customers = ((from z in TestLinq1DataContext.customer orderby z.id select z) as IListSource).GetList() as BindingList<customer>;
                customerViewSource.Source = customers;
                customerViewSource.View.MoveCurrentToPosition(position);
            }

    Есть таблица в sql и в wpf  "связаны" через CollectionViewSource customerViewSource

    пользователей sql много каждый обновляет данные таблицы SQL. Необходимо отслеживать изменения на клиентах

    Пока состряпал код представленный выше. Недостатки:

    1. теряется фокус таблицы отображающей результаты.

    2. невозможно редактировать строки непосредственно в таблице на клиенте (WPF Datagrid).

    Как-то вот оно по другому должно работать, как с PropertyChange, но не могу найти информацию.

    TestLinq1DataContext.Refresh красиво отрабатывает, но customers приходится заного запрашивать следующей строкой.


    • Изменено serge73 26 апреля 2013 г. 7:28
    26 апреля 2013 г. 7:22

Ответы

  • Добрый день.

    К сожалению, SQL не умеет уведомлять "внешний" по отношению к нему мир о изменении данных. Все запросы идут с клиентской активацией. В вашем случае, можно рассмотреть вариант со считыванием данных в отдельный список, сравнении с отображаемым. Совпадают или идет редактирование, ждем следующего тика, не совпадают и нет редактирования, подсовываем их в основное представление.

    P.s. Нет, есть еще вариант, написать сервис, который будет отслеживать изменения в БД, обнаруживать все запущенные экземпляры приложения, рассылать им уведомление о том, что пора перечитать данные, но сложность во многих случаях, такого решения будет неоправданно высокой.

    P.p.s. А еще можно не обновлять принудительно, постоянно, а сделать обновление по кнопке и/или перед редактированием.

    26 апреля 2013 г. 12:58
    Отвечающий

Все ответы

  • Добрый день.

    К сожалению, SQL не умеет уведомлять "внешний" по отношению к нему мир о изменении данных. Все запросы идут с клиентской активацией. В вашем случае, можно рассмотреть вариант со считыванием данных в отдельный список, сравнении с отображаемым. Совпадают или идет редактирование, ждем следующего тика, не совпадают и нет редактирования, подсовываем их в основное представление.

    P.s. Нет, есть еще вариант, написать сервис, который будет отслеживать изменения в БД, обнаруживать все запущенные экземпляры приложения, рассылать им уведомление о том, что пора перечитать данные, но сложность во многих случаях, такого решения будет неоправданно высокой.

    P.p.s. А еще можно не обновлять принудительно, постоянно, а сделать обновление по кнопке и/или перед редактированием.

    26 апреля 2013 г. 12:58
    Отвечающий
  • У меня пока проблема не с тем как sql уведомляет клиентов о изменении, тут вариантов с десяток сразу можно назвать.

    Ваш первый вариант один из самых ресурсозатратных.

    Второй интереснее, и можно без сервиса обойтись, если часть задачи переложить на sql.

    Проблема в незаметном обновлении DataGrid в WPF. Фокус теряется и момент обновления данных мешает редактированию.

    Ручной запрос конечно все решает, но все-таки автоматизировать это хочется.

    Таймер в моем коде использован для эксперимента, как быстро реализуемый вариант.

    26 апреля 2013 г. 15:09