Afficher une combo et une data grid synchronisées.

 

EXO Catalogue

·       Continuer en gérant une combo « catégorie » et gérer l’événement pour afficher les bons articles

 

Compléter le web service :

 

Nous allons maintenant ébaucher une vraie application de catalogue en ligne.

Ajouter un web method pour envoyer la liste des catégories.

Adopter la même approche que pour  les articles. Ce sera du code ADO classique.

 

 

      [WebMethod]

      public List<Categorie> getCategories()

 

 

[WebMethod]

      public List<Article> getArticlesByCat(string refCat)

Voici le code xaml.

 

<UserControl xmlns:my="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"  xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"  x:Class="Catalogue.Page"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    Width="400" Height="500" Loaded="UserControl_Loaded">

 

    <StackPanel x:Name="general" Width="400" Height="500">

<TextBlock x:Name="txtTitre" TextAlignment="Center" Text="Catalogue" FontSize="20" ></TextBlock>

<Button x:Name="btnChercher" Width="400" Height="20" Content="Afficher tous les articles" Click="ClicGetCatalogue"></Button>

 

<StackPanel x:Name="combo" Orientation="Horizontal" HorizontalAlignment="Center">

<TextBox x:Name="lblCombo" Width="150" Text="Chosir une catégorie"></TextBox>

<ComboBox x:Name="cbCategorie" Width="250"  SelectionChanged="cbCategorie_SelectionChanged">

</ComboBox>

        </StackPanel>

 

<data:DataGrid x:Name="gdArticles" AutoGenerateColumns="True" Width="400" Height="300"></data:DataGrid>

    </StackPanel>

</UserControl>

 

 

Code Csharp  du composant Silverlight:

 

 

//Déclarer le proxy comme donnée membre pour éviter de le rechercher à //chaque appel, la recherche d’un proxy est une opération couteuse.

//Il faudra cependant vérifier que cette approche ne bloque pas de //ressources sur le serveur.

      

private ServiceReferenceCatalogue.ServiceCatalogueSoapClient leProxy;

 

 

 

Nous avons affecté un handler à l’événement fin du chargement en écrivant dans le xaml:

 

Loaded="UserControl_Loaded"

 

Voici le code C Sharp de fin de chargement:

 

 

       private void UserControl_Loaded(object sender, RoutedEventArgs e)

        {

            //déclarer un proxy sur le service

leProxy = new Catalogue.ServiceReferenceCatalogue.ServiceCatalogueSoapClient();

 

            //attacher un handler de fin à chaque service

leProxy.getAllArticlesCompleted += new EventHandler<Catalogue.ServiceReferenceCatalogue.getAllArticlesCompletedEventArgs>(getAllArticlesCompleted);

 

EventHandler<Catalogue.ServiceReferenceCatalogue.getArticlesByCatCompletedEventArgs>(getArticleByCatCompleted);

 

            //remplir la combo

            this.loadComboCategorie();

        }// fin loaded

 

 

A la différence de l’exercice précédent et pour éviter des répétitions de code, nous avons dès le load :

 

       private void loadComboCategorie()

        {

            // handler de fin

leProxy.getCategoriesCompleted += new EventHandler<Catalogue.ServiceReferenceCatalogue.getCategoriesCompletedEventArgs>(loadComboCategorieCompleted);

            // lancer opération

            leProxy.getCategoriesAsync();

        }//fin init load combo categorie

 

private void loadComboCategorieCompleted(object sender, Catalogue.ServiceReferenceCatalogue.getCategoriesCompletedEventArgs e)

        {

            this.cbCategorie.DisplayMemberPath = "Cat";

this.cbCategorie.ItemsSource = (System.Collections.IList)e.Result;

        }// fin load complete combo categorie

 

 

Nous avons déclaré le handler d’événement dans le xaml :

 

SelectionChanged="cbCategorie_SelectionChanged"

 

Et voici le traitement de l’événement :

 

private void cbCategorie_SelectionChanged(object sender,  SelectionChangedEventArgs e)

        {

            //récupérer la référence de catégorie

            Catalogue.ServiceReferenceCatalogue.Categorie laCat;

 laCat= (Catalogue.ServiceReferenceCatalogue.Categorie)this.cbCategorie.SelectedItem;

            String refCat = laCat.RefCat;

 

            //lancer la recherche

            leProxy.getArticlesByCatAsync(refCat);

 

        }// fin clic catalogue completed

 

private void getArticleByCatCompleted(Object sender, Catalogue.ServiceReferenceCatalogue.getArticlesByCatCompletedEventArgs e)

        {

this.gdArticles.ItemsSource = (System.Collections.IList)e.Result;

        }//fin selection changed completed

 

 

 

Chapitre suivant.