Afin de développer un contrôle source de données, il suffit de créer une classe qui implémente l'interface IDataSource. Cependant le framework.net propose une classe abstraite un peu plus riche : la classe DataSourceControl. Cette classe hérite de System.Web.UI.Control et implémente IDataSource ainsi qu'IListSource, et nous allons donc créer une classe qui hérite de cette classe abstraite afin de définir notre classe FlickrDataSource. Cette classe expose différentes propriétés importante pour son fonctionnement tel que l'ID du set de photos qui sera affichée, le nom d'utilisateur qui sera utilisé pour filtrer les sets dans l'interface de configuration. La méthode la plus importante est la méthode GetView. Cette méthode permet de renvoyer une vue de données qui contiendra les donnés pouvant être affichées par le contrôle d'affichage.
public class FlickrDataSource:DataSourceControl
{
private FlickrDataSourceView m_view;
private Photo[] m_photos;
private Flickr m_flickr;
private string m_apiKey;
private string m_userName;
private string m_userId;
private string m_setId;
public void GetSetPhotos()
{
m_flickr = new Flickr(m_apiKey);
Photoset set = m_flickr.PhotosetsGetPhotos(ViewState["flickrPhotoSetId"].ToString());
Photo[] setPhotos;
m_photos = set.PhotoCollection;
}
public string PhotoSetId
{
get
{
if (ViewState["flickrPhotoSetId"] !=null)
return ViewState["flickrPhotoSetId"].ToString();
else
return m_setId;
}
set { ViewState["flickrPhotoSetId"] = value;
m_setId = value;
}
}
public string UserName
{
get { return m_userName; }
set
{ m_userName = value;
m_flickr = new Flickr(m_apiKey);
m_userId = m_flickr.PeopleFindByUsername(value).UserId;
}
}
public string ApiKey
{
get { return m_apiKey; }
set { m_apiKey = value; }
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Photo[] Photos
{
get { return m_photos; }
set { m_photos = value; }
}
protected override DataSourceView GetView(string viewName)
{
if (m_view == null)
{
m_view = new FlickrDataSourceView(this, viewName);
}
return m_view;
}
}