Sébastien Pertus
Création d'un ScriptControl Ajax
Création d'un contrôle ScriptControl, à l'aide du framework Ajax Extensions 1.0 et l'Atlas Toolkit
Par Sébastien Pertus publié le 14/05/2007 à 08:33, lu 2393 fois, 9 pages
 5 | Un ObjectDataSource embarqué
Pour nous rapprocher au plus prés des habitudes des développeurs asp.net en général, il serait de bon aloi de leur fournir un moyen dont ils ont l'habitude pour accéder à la classe capable de renvoyer les informations à afficher dans le Popup.
Aujourd'hui lorsque l'on veut lier un contrôle à une source de donnée, la plupart du temps, nous pouvons passer par un Contrôle ObjectDataSource auquel nous fournissons une méthode Select via la propriété SelectMethod ainsi qu'une liste de paramètres à passer à cette méthode.

Nous allons donc développer un ObjectDataSource embarqué dans notre Contrôle !
Pour ce faire nous allons implémenter un Pattern DataSourceControl.

Si nous prenons exemple sur l'ObjectDataSource, on peut le décomposer en deux objets distincts :
L'ObjectDataSource : C'est la classe que l'on utilise tous, qui permet de définir les paramètres, les noms de méthodes etc... C'est purement un contrôle visuel.Cette classe implémente l'interface IDataSource.
Note : Aurait-on pu plutôt pu hériter de la classe DataSourceControl ? Non, puisque nous héritons déjà de ScriptControlBase !

L'ObjectDataSourceView : C'est une classe non visible, mais c'est elle qui fera tout le boulot de requêtage, réflexion et analyse de paramètres renvoyés par l'ObjectDataSource. Bien sur, elle renvoie le résultat de la requête sous format IEnumerable.
Cette classe hérite de DataSourceView.

Dans notre cas, la classe implémentant IDataSource sera notre contrôle lui-même, permettant ainsi de récupérer les valeurs de la méthode SelectMethod et l'ensemble des paramètres.
Nous créons ensuite une classe AutoCompleteView héritant de DataSourceView.
L'objet de cet article n'étant pas de décortiquer cette implémentation, je vous laisse découvrir le code par vous-même, qui reste relativement simple à comprendre.

A quoi cela servira-t'il dans notre contrôle au final ?
Il suffit de voir son implémentation dans notre designer :

<cc1:AutoCompleteScriptControl Width="200px" ID="txtProductSearchPostBack" runat="server"

    DataTextField="Name" DataValueField="Id" SelectMethod="GetList" 

    TypeName="WebExtenderAjax.ProductManager" CompletionInterval="200">

<SelectParameters>

<asp:ControlParameter ControlID="txtProductSearchPostBack"  Name="name" PropertyName="Text" />

</SelectParameters>

</cc1:AutoCompleteScriptControl>

On constate que notre contrôle devra appeller la méthode GetList de la classe WebExtenderAjax.ProductManager, et qui attend un paramètre nommé name.
Ce qui correspond bien à l'appel de cette méthode :

namespace WebExtenderAjax

{

   public class ProductManager

    {

        public Product GetProduct(int Id)

        {

 

            Product e = null;

 

            SqlConnection conn = new SqlConnection(WebExtenderAjax.Properties.Settings.Default.AdvConnectionString);

 

            SqlCommand comm = new SqlCommand("Select * from Production.Product where ProductID = @ProductID", conn);

 

            SqlParameter p = new SqlParameter("@ProductID", SqlDbType.Int);

            p.Value = Id;

 

            comm.Parameters.Add(p);

            conn.Open();

 

            try

            {

                SqlDataReader dr = comm.ExecuteReader();

 

                while (dr.Read())

                {

                    e = new Product();

                    e.Id = (int)dr["ProductID"];

                    e.ProductNumber = (String)dr["ProductNumber"];

                    e.Name = (String)dr["Name"];

                    e.SellStartDate = (DateTime)dr["SellStartDate"];

 

                }

 

                dr.Close();

            }

            catch (Exception ex)

            {

                Debug.WriteLine(ex.Message);

            }

            finally

            {

                conn.Close();

            }

 

 

            return e;

        }

 
» Démarrer une discussion