Afficher une DataGrid via un service web

 

EXO DataGrid

·       Afficher une grid contenant tous les articles du catalogue.

 

 

Coder le service Web.

 

La transmission d’un dataset semble poser quelques problèmes, de plus le type dataset est trop spécifique Microsoft, il est plus inter opérable de transmettre les résultats dans une List.

 

Il faut donc d'abord créer une classe Article, penser à coder des properties pour tous les membres.

 

public class Article

{

    private String codeArticle;

    private String categorie;

    private String designation;

 

    public Article()

    {

    }

 

    public String CodeArticle

    {

        get

        {

            return this.codeArticle;

        }

        set

        {

            this.codeArticle = value.ToUpper();

        }

    }// fin property

 

    public String Designation

    {

        get

        {

            return this.designation;

        }

        set

        {

            this.designation = value.ToUpper();

        }

    }// fin property

 

    public String Categorie

    {

        get

        {

            return this.categorie;

        }

        set

        {

            this.categorie = value.ToUpper();

        }

    }// fin property

}// fin classe article

 

Coder le service proprement dit:

 

 

[WebMehod]

   

public List<Article> getAllArticles()

    {

        List<Article> result;      //List et non pas Ilist ?

        SqlConnection connCfna = null;

 

        try

        {

String strCon = ConfigurationManager.ConnectionStrings["CfnaConnectionString"].ConnectionString;

 

//créer un objet connection

            connCfna = new SqlConnection();

            connCfna.ConnectionString = strCon;

 

            result = new List<Article>(); //préparer la liste résultat

 

            connCfna.Open();        //ouvrir la connection

 

            //Créer un objet requête

            SqlCommand sqlArticles = new SqlCommand();

            sqlArticles.Connection = connCfna;

            sqlArticles.CommandType = CommandType.Text;

sqlArticles.CommandText = "select CodeArticle,Designation,Categorie from articles";

 

            //executer la requête

            SqlDataReader rdArticles = sqlArticles.ExecuteReader();

 

            //Parcourir le recordset

            while(rdArticles.Read())

            {

                //créer un article

                Article unArticle = new Article();

 

                //recopier membre à membre

                unArticle.CodeArticle = rdArticles.GetString(0);

                unArticle.Designation = rdArticles.GetString(1);

                unArticle.Categorie = rdArticles.GetString(2);

 

                //ajouter l'article au résultat

                result.Add(unArticle);

            }//fin parcours recordset

 

            connCfna.Close();       //fermer la connection

 

        }// fin cas nominal

        catch (Exception ex)

        {

                      throw new System.ServiceModel.FaultException(ex.Message);

        }// fin catch

 

        finally

        {

            if (connCfna != null)

            {//toujours bien refermer la connection

                if (connCfna.State == ConnectionState.Open)

                {

                    connCfna.Close();

                }

            }

        }// fin finally

 

        return result;

    }// fin getAllArticles

 

 

 

Bien noter que la liste doit être déclarée List et non pas Ilist. Sinon vous obtiendrez un message d'erreur concernant la sérialisation. (Bizarre).

Coder le composant silverlight.

 

Taper le code xaml

 

<UserControl 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">

 

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

 

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

 

<Button x:Name="btnChercher" Width="100" Height="50" Content="clic" Click="ClicGetCatalogue"></Button>

 

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

 

    </StackPanel>

</UserControl>

 

 

C’est la DataGrid qui assure l’affichage du catalogue, comme dans une application Windows classique. Déclarer AutoGenerateColumns="True" pour que les colonnes de la grid soient décidées en fonction du résultat reçu, ici les champs de la classe Article.

 

Ajouter (ou mettre à jour) la référence de service.

Taper le code behind :

 

      private void ClicGetCatalogue(object sender, RoutedEventArgs e)

      {

      //déclarer un proxy sur le service

ServiceReferenceCatalogue.ServiceCatalogueSoapClient leProxy = new Catalogue.ServiceReferenceCatalogue.ServiceCatalogueSoapClient();

 

      //attacher un handler de fin

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

 

      //lancer l'opération

         System.Net.WebRequest.RegisterPrefix("http://",System.Net.Browser.WebRequestCreator.ClientHttp);

      leProxy.getAllArticlesAsync();

      }//fin clic catalogue Start

 

      //handler pour traiter la réponse du servie web.

private void getAllArticlesCompleted(Object sender, Catalogue.ServiceReferenceCatalogue.getAllArticlesCompletedEventArgs e)

        {

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

        }// fin clic catalogue completed

Il est donc relativement évident, la mise à jour de la grille s’otient en renseignat sa propriété ItemsSource n’oubliez pas le cast du résultat. ItemsSource doit implémenter l’interface IList.

 

Vous pouvez également considérer une collection générique :

                    System.Collections.Generic.IList<Catalogue.ServiceReferenceCatalogue.Article>)e.Result;

//La classe article a été générée dans référence.cs

 

 

Chapitre suivant.