Механизм привязки данных (DataBinding), страница 18

¨  Введите новую версию обработчика события RunWorkerCompleted. Здесь работник получает небольшой отпуск.

void ordersWorker_RunWorkerCompleted (object sender, RunWorkerCompletedEventArgs e)

{

ordersSource.DataSource = e.Result;

ShowProgress(false);      // Выключаем таймер, понукающий работником

UseWaitCursor = false;

gridOrders.Cursor = Cursors.Default;

}

¨  Так как современные компьютеры работают довольно быстро, вы можете не заметить манипуляции с индикатором прогресса. Добавьте в метод GetOrders имитацию ожидания обработки запроса удаленным сервисом.

Random rand = new Random ();

Thread.Sleep (rand.Next (1, 4) * 500); // Имитируем задержки при загрузке таблицы

Запустите приложение и сравните его функционирование с тем, что было ранее. Оценивая результат, хочу сказать, что суета со вторым потоком не доставила особого удовольствия, да и она не оправдана в нашем сценарии, так как пользователь все равно ничего не может делать в течение времени, пока обрабатывается запрос. Но теперь мы научились нескольким приемам, которые, возможно, понадобятся при реализации других, более сложных сценариев.

Подключаем Web-сервис

Для подключения Web-сервиса надо вместо строки:

e.Result = GetOrders (e.Argument.ToString ());

в методе, реагирующем на событие DoWork, вставить строку:

e.Result = service.GetOrders (e.Argument.ToString ()).Tables["Orders"];

которая обращается к одноименному методу GetOrders, но расположенному не в классе нашей формы, а в классе Web--сервиса OrdersService (производному от WebService).

При запуске новой версии может статься, что вы увидите сообщение о том, что сервер активно не желает общаться. Это устрашающее сообщение выглядит таким образом.

Обычно это происходит в тех случаях, когда был большой перерыв между отладкой проекта типа Web-сервис и отладкой проекта клиентского Windows-приложения. Не отчаивайтесь, надо просто запустить службу ASP.NET Developement Server, которая необходима для работы Web-сервиса. Эта служба довольно капризна, что следует из описания некоторых причин ее отказов (см. в MSDN следующие темы: Troubleshooting the ASP.NET Development Server, How to: Bypass a Proxy Server for Local Web Requests и How to: Specify a Port for the ASP.NET Development Server). Мне же помог такой прием.

¨  В контекстном меню проекта MyServices дайте команду Set as StartUp Project.

¨  Запустите проект в режиме отладки (нажмите F5).

¨  Если увидите при этом еще одно пугало которое приведено ниже), то согласитесь с предложением отключить забавную (и малопонятную) настройку. Я думаю, что кто-то разработал утилиту для помощи в отладке, но она сильно мешает (плохо стыкуется с ASP.NET) и кто-то другой рекомендует ее отключить.

¨  Добейтесь того, чтобы сервер запустился. Он проявит себя тем, что начнет работать, а также тем, что появится в окне System Tray.

¨  Вновь сделайте стартовым проект OrdersClient и запустите его.

Метод GetOrders Web-сервиса должен выполнить ту же работу, что и локальный метод GetOrders, но это происходит в приложении с принципиально другой архитектурой.

Итак, мы обратились к Web-сервису и получили от него набор данных с отфильтрованной таблицей заказов. При желании добавьте в удаленную версию метод GetOrders имитацию ожидания обработки запроса.

DataViews

Random rand = new Random ();

Thread.Sleep (rand.Next (1, 4) * 500); // Simulate load delay

DataViews provide a seperate object for filtering and sorting data. The DataViewManager stores DataViews, a DataView stores DataRowViews much like a DataSet holds DataTables and a DataTable holds DataRows. Since DataViews are independent objects, you can create and configure them at design time in VS.NET. You can also bind controls to DataViews which is useful for storing default sorting and filtering criteria.

Note that DataViews are not strongly typed. You can obtain the DataRowView.Row object that returns the original row from the original DataTable and cast this, or just access the field by an indexed name as in the following example.