Patrice Lamarche
Créer des contrôles sources de données (DataSource objects) avec ASP.net 2
Développement d'un contrôle DataSource qui permet d'effectuer du databinding avec des photos du site Flickr.
Par Patrice Lamarche publié le 19/08/2007 à 23:05, lu 8079 fois, 6 pages
 4 | Création du designer
Visual Studio permet de créer et d'affiche des fenêtres de configuration pour les différents contrôles. A partir de Visual Studio 2005 ces fenêtres de configuration sont accessibles grâce à un SmartTag qui apparait lors de la sélection du contrôle en mode design. Afin de supporter cette fonctionnalité, il est nécessaire de créer une classe héritant de DataSourceDesigner.
Cette classe permet de définir si le contrôle peut être configuré grâce à la propriété CanConfigure.
Il ne reste plus qu'à appeler la méthode ConfigureFlickrDataSource depuis une redéfinition de la méthode Configure qui sera appelée par Visual Studio. Cette méthode Configure appelle notre méthode ConfigureFlickrDataSource de manière transactionnelle grâce à un appel de InvokeTransactedChange. On appelle ensuite la fenêtre de configuration en lui passant en paramètre le FlickrDataSource configuré afin d'être capable d'interagir avec lui. A noter que nous récupérons pour cela une instance de IUIService qui représente le designer de Visual Studio afin d'avoir une fenêtre « intégrée » à l'IDE.

class FlickrDataSourceDesigner : DataSourceDesigner

{

    private FlickrDataSource m_dataSource;

    private FlickrDesignerDataSourceView m_view;

 

    public FlickrDataSource DataSource

    {

        get { return m_dataSource; }

    }

 

    public override bool CanConfigure

    {

        get

        {

            return true;

        }

    }

 

    public override DesignerDataSourceView GetView(string viewName)

    {

        if (m_view == null)

        {

            m_view = new FlickrDesignerDataSourceView(this, viewName);

        }

 

        return m_view;

    }

 

    public override void Configure()

    {

        InvokeTransactedChange(Component, new TransactedChangeCallback(ConfigureFlickrDataSource), null,

"Configure Data Source");

    }

 

    public override void Initialize

(System.ComponentModel.IComponent component)

    {

        base.Initialize(component);

        m_dataSource = (FlickrDataSource)component;

 

    }

 

    private bool ConfigureFlickrDataSource(object context)

    {

        DialogResult result;

        try

        {

            SuppressDataSourceEvents();

            using (FlickrDataSourceConfigForm form = new FlickrDataSourceConfigForm(m_dataSource))

            {

                IUIService uiService = (IUIService)GetService(typeof(IUIService));

                result = uiService.ShowDialog(form);

                if (result == DialogResult.OK)

                {

                    OnSchemaRefreshed(EventArgs.Empty);

                }

 

            }

 

        }

        finally

        {

            ResumeDataSourceEvents();

        }

        return (result == DialogResult.OK);

    }

}

 

Afin de lier cette classe Designer avec la classe FlickrDataSource, il suffit de décorer cette dernière classe avec l'attribut Designer :

[Designer(typeof(FlickrDataSourceDesigner))]

public class FlickrDataSource:DataSourceControl

L'aperçu en mode design peut être implémenté très simplement en créant une classe héritant de la classe DesignerDataSourceView. Une redéfinition de la méthode GetDesignTimeData permet alors de définir la logique d'affichage qui sera exécuté par Visual Studio afin d'afficher de remplir le contrôle d'affichage de données en mode Design. Cette méthode vous permet de définir l'argument isSampleData en sortie qui permet d'indiquer si les données renvoyées sont des données réélles ou fictives.

internal class FlickrDesignerDataSourceView : DesignerDataSourceView

{

    private FlickrDataSourceDesigner m_owner;

 

    public FlickrDesignerDataSourceView(FlickrDataSourceDesigner owner, string viewName)

        : base(owner, viewName)

    {

        m_owner = owner;

    }

 

    public override IDataSourceViewSchema Schema

    {

        get

        {

            return base.Schema;

        }

    }

 

    public override System.Collections.IEnumerable GetDesignTimeData(int minimumRows, out bool isSampleData)

    {

        m_owner.DataSource.GetSetPhotos();

        isSampleData = false;

        return m_owner.DataSource.Photos;

    }

}

Nous sommes donc capables de remplir avec les données réelles le contrôle en mode design. Il est à noter que Microsoft ne fournit pas ce genre d'aperçu avec ses contrôles source de données mais les remplit avec des données fictives exemples probablement pour ne pas pénaliser les performances de Visual Studio car l'affichage de données réelles peut fortement pénaliser les performances du mode design. Ainsi le mode Split de Visual Studio pourra être fortement ralenti du fait de cet affichage de données réelles provenant d'Internet. Une évolution du contrôle pourrait donc consister en l'ajout d'une propriété booléenne permettant au développeur de choisir s'il souhaite afficher les données réelles en mode design ou non.
 
» Démarrer une discussion