2010-05-30 2 views
3

Есть ли способ заставить datagrid прослушивать базу данных и автоматически обновлять данные, если данные базы данных изменены? Я использую базу данных SQL Server.Datagrid не обновляется по измененным данным

Я хотел бы использовать Linq-2-SQL, если это возможно

ответ

2

Поскольку @Slaggg спросил: есть довольно простые способы сделать это, но они почти наверняка будут привлекать много кодирования, это будет влиять на производительность довольно значительно, и мой сильные подозрение в том, что это будет больше проблем, чем того стоит.

Тем не менее, для применения типичных многоуровневых, на очень высоком уровне, вам нужно:

(1) способ оповещать среднего уровня, когда данные изменения. Вы можете использовать триггеры настраиваемого кода внутри каждой таблицы, которые сбрасывают какое-то уведомление (возможно, используя хранимые процедуры WCF и CLR), или вы можете использовать объект SqlDependency. Вероятно, второй будет работать лучше.

(2) Способ уведомления каждого клиента, подключенного к этому среднему уровню. Предполагая, что вы используете WCF, вам нужно использовать одно из доступных двухсторонних привязок, например Net.TCP или HttpPollingDuplex (для Silverlight). Вам нужно убедиться, что это правильно настроено как на клиенте, так и на сервере. Вам также нужно будет вручную отслеживать, какие клиенты могут быть заинтересованы в обновлении, чтобы вы могли узнать, какие из них необходимо обновить, и вам нужно будет удалить их из этого списка, когда они уйдут или перерыв. У Томека из команды MS WCF есть несколько хороших примеров на его blog, которые вы можете изучить.

(3) Механизм обновления модели локального клиента и/или модели просмотра и/или пользовательского интерфейса после получения уведомления из среднего уровня о том, что что-то изменилось. Это сложнее, чем вы думаете: достаточно сложно поддерживать синхронизацию вашего пользовательского интерфейса с вашей моделью данных при нормальных обстоятельствах, но это становится значительно более сложным, когда эта модель данных может меняться под вас и с другого направления.

Идея за этими видами уведомлений достаточно проста: но получение всех подробных сведений, вероятно, позволит вам отлаживать путь в ночное время. И парень, который должен поддерживать все эти два года спустя, проклинает ваше имя.

Надеюсь, это поможет.

1

Это зависит от того, где вы обновляете базу данных:

  • Из того же контекста (в Silverlight, Вы добавляете, удаление, редактирование на той же странице)
  • с ChildWindow в вашем Silverlight приложения
  • Из внешнего, несвязанной инструмента, за пределами вашего Silverlight приложения
+0

Я так рад, что вы просите об этом, и извините, что не предоставляли эту информацию в первую очередь. В моем приложении silverlight есть tabcontrol, который содержит UC, я рассматриваю возможность внедрения интерфейса ITabUserControl, который имеет метод updateonselected, а затем обновляет ui каждый раз, когда выбирается вкладка. Будет много клиентов, поэтому я думаю, что SqlDependencies вызовет слишком большую нагрузку. Как это звучит для вас, ребята? – Jakob

+0

Думаю, вам придется подумать, что «x пользователи щелкают y-tabs каждый z-time».Если у вас есть довольно много клиентов, которые нажимают на ваши вкладки, я полагаю, у вас будет огромное количество трафика, идущего туда и обратно в зависимости от объема необходимых данных. Предполагая, что вы это осознаете, если у вас есть достаточно много оборудования для резервного копирования трафика, это приведет к тому, что я не вижу проблемы с подходом SelectedTabChanged, хотя я был веб-сайтом, я предпочел бы, чтобы переключение на биржу с помощью добавления изменений , где пользователи больше привыкли видеть новые данные. Вы рассмотрели кнопку обновления? – Sam

+0

Не похоже, что он вообще отвечает на вопрос. Я ошеломлен, это принятый ответ. Все еще интересно - как мне получить мой datagrid для обновления, когда какой-либо внешний инструмент записывает в базу данных? – Slaggg