Опубликован: 01.03.2010 | Доступ: свободный | Студентов: 957 / 46 | Оценка: 4.38 / 4.31 | Длительность: 09:26:00
Дополнительный материал 1:

Практикум

< Лекция 7 || Дополнительный материал 1: 12345678910111213

Работа с веб-сервисом

После подключения к веб-сервису Аэрофлота создаем интерфейс для посылки запросов к нему и отображения результата. Теперь необходимо изменить содержимое файла MainPage.xaml, как показано ниже:

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" 
    xmlns:dataFormToolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.DataForm.Toolkit" 
    xmlns:AEROSilverlightApplication_FlightStatusReference="clr-namespace:AEROSilverlightApplication.FlightStatusReference" 
    xmlns:local="clr-namespace:AEROSilverlightApplication" 
    x:Class="AEROSilverlightApplication.MainPage"
    d:DesignWidth="640" d:DesignHeight="480">
    <StackPanel x:Name="LayoutRoot" >
        	<ComboBox
        		x:Name="airoportListBox"
			Width="200" 
                	HorizontalAlignment="Left" 
                	SelectedIndex="0">
        		<ComboBoxItem Content="Список аэропортов"/>
        	</ComboBox>
        	<ComboBox                                    
        		x:Name="dateListBox" 
			Width="200" 
           	HorizontalAlignment="Left" 
                	SelectedIndex="0">
        		<ComboBoxItem Content="Доступные даты"/>
        	</ComboBox>
        	<Button 
        		Click="Button_Click" 
        		Content="Искать рейсы"
			Width="200" 
                	HorizontalAlignment="Left"/>
        	<TextBlock Text="Отправление"/>
        	<data:DataGrid x:Name="departureListGrid" 
                           HorizontalAlignment="Left"/>
        	<TextBlock Text="Прибытие"/>
        	<data:DataGrid x:Name="arrivalListGrid" 
                           HorizontalAlignment="Left"/>
    </StackPanel>
</UserControl>

В данном файле описаны 2 элемента управления ComboBox. airoportListBox - содержит список аэропортов всего мира, dateListBox - список дат, на которые имеются данные о рейсах. Элементы управления TextBlock - соответствующие надписи для элементов DataGrid. Эти элементы отображают список рейсов прибывающих ( arrivalListGrid ) и вылетающих ( departureListGrid ) в заданный день с выбранного аэропорта. Имеется кнопка Button, при нажатия которой (событие Button_Click ) выполнится обращение к веб-сервису, а результат будет занесен в элементы DataGrid.

После этого переходим к редактированию кода страница code-behind. Содержимое файла MainPage.xaml.cs приведено ниже:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using AEROSilverlightApplication.FlightStatusReference;
using System.Collections.ObjectModel;
using System.Collections;

namespace AEROSilverlightApplication
{
    public partial class MainPage : UserControl
    {
        public FlightStatusSoapClient flightStatusClient;
        public MainPage()
        {
            InitializeComponent();            
            flightStatusClient = 
                new FlightStatusSoapClient();
            flightStatusClient.AirportListCompleted += 
                new EventHandler<AirportListCompletedEventArgs>
                    (flightStatusClient_AirportListCompleted);
            flightStatusClient.DateListCompleted += 
                new EventHandler<DateListCompletedEventArgs>
                    (flightStatusClient_DateListCompleted);
            flightStatusClient.AirportListAsync();
            flightStatusClient.DateListAsync();
        }
        private void Button_Click
            (object sender, RoutedEventArgs e)
        {
            string code = 
                airoportListBox.SelectedItem.ToString().Substring(0, 3);
            string date = 
                dateListBox.SelectedItem.ToString();
            flightStatusClient.DepartureCompleted += 
                new EventHandler<DepartureCompletedEventArgs>
                    (flightStatusClient_DepartureCompleted);
            flightStatusClient.ArrivalCompleted += 
                new EventHandler<ArrivalCompletedEventArgs>
                    (flightStatusClient_ArrivalCompleted);
            flightStatusClient.DepartureAsync(code, date, "sched", "asc");
            flightStatusClient.ArrivalAsync(code, date, "sched", "asc");
        }
        void flightStatusClient_ArrivalCompleted
            (object sender, ArrivalCompletedEventArgs e)
        {
            arrivalListGrid.ItemsSource = e.Result;
        }
        void flightStatusClient_DepartureCompleted
            (object sender, DepartureCompletedEventArgs e)
        {
            departureListGrid.ItemsSource = e.Result;
        }
        void flightStatusClient_DateListCompleted
            (object sender, DateListCompletedEventArgs e)
        {
            IEnumerable<DateTime> query = 
                e.Result.OrderBy(date => date);
            IEnumerable<string> query1 = 
                query.Select<DateTime, string>
                (date => date.ToShortDateString());
            dateListBox.Items.Clear();
            dateListBox.ItemsSource = query1;
        }
        void flightStatusClient_AirportListCompleted
            (object sender, AirportListCompletedEventArgs e)
        {
            IEnumerable<Airport> query = 
                e.Result.OrderBy(Airport => Airport.city);
            IEnumerable<string> query1 = 
                query.Select<Airport, string>
                (Airport => Airport.code + ' ' + Airport.city);
            airoportListBox.Items.Clear();
            airoportListBox.ItemsSource = query1;
        }
    }
}

Рассмотрим код. Конструктор класса MainPage(). Вначале при загрузке страницы создается экземпляр класса FlightStatusSoapClient. Он необходим для асинхронного вызова данных. Затем асинхронно вызываем методы этого класса AirportListAsync() и DateListAsync(), для того, чтобы получить список аэропортов и дат. Добавляем обработчики событий AirportListCompleted и DateListCompleted, для того чтобы принять и обработать полученные данные.

После того, как пользователь выбрал дату и аэропорт из списка, например, аэропорт Вены и 8 октября 2009 г, и нажал кнопку поиска, при срабатывают события Button_Click, заданное в xaml файле Click="Button_Click".

После этого будут вызваны асинхронные методы, получающие от веб-сервиса списки рейсов прибывающих и вылетающих.

После завершения отладки приложения можно увидеть результат (см. рис.P.36)

Работа приложения с веб-сервисом

увеличить изображение
Рис. P.36. Работа приложения с веб-сервисом

Выбран аэропорт Вены, дата 8 октября 2009 г. Мы видим 2 рейса отправляющихся в Москву и два рейса прибывающих из Москвы в этот день.

Заключение

В данном разделе рассмотрен пример создания приложения для работы с веб-сервисом Аэрофлота. Исходный код рассмотренного решения расположен в каталоге AERO.

< Лекция 7 || Дополнительный материал 1: 12345678910111213