[SharePoint 2010] Faire une WebPart asynchrone

Dans une page SharePoint, il se peut que plusieurs WebParts soient disposées un peu partout.

Si vous lancez des requêtes sur des listes ou sur des bases de données par exemple, les temps de réponse peuvent être très longs, ce qui ralentira toute la page. Les temps de chargement seront de plus en plus longs pour l’utilisateur, puisqu’il faudra attendre la fin de tous les calculs pour que l’affichage apparaisse.

Si la WebPart n’est pas une des plus importantes, il y a une manière simple de la rendre asynchrone est ainsi nous pourrons charger la page très vite et avec un système de loading, faire apparaitre les données d’une WebPart plus gourmande quelques secondes après. L’utilisateur pourra alors parcourir la page tout en attendant que le dernier module se charge.

Il faut cependant savoir que le résultat de la callback, donc de l’événement, sera sous forme d’un “string”. Il faudra donc générer nous même le html afin de pouvoir afficher correctement des données. C’est le prix à payer pour pouvoir rentre votre WebPart asynchrone 🙂

Avec un peu plus de temps, nous pouvons réussir à réaliser ce que l’on souhaite.

Pour commencer, dans le code behind de votre WebPart, il faut override le Render afin d’afficher une image de chargement, le temps que la requête se fasse.

 

protected override void Render(HtmlTextWriter writer)
{
    // TODO: add custom rendering code here.
    this.datadiv = this.ClientID + "content";
writer.Write("<div id=\"" + this.datadiv + "\"><img src=\"_layouts/progressbar.GIF\" width\"300\"></div>"); }

Nous définissons là une nouveau div que nous allons créer, avec un nom unique pour éviter toutes confusions. Le plus simple est d’ajouter ensuite un GIF contenant une animation de chargement. Vous pouvez trouver votre bonheur ici : http://weblogs.asp.net/wkriebel/archive/2010/01/26/animated-gifs-in-sharepoint-2007-for-ajax-progress-indicators.aspx

Ce site vous invite également à aller voir dans votre dossier image de SharePoint pour aller récupérer l’animation qui vous convient le mieux 🙂

Une fois votre animation mise en place, il faut maintenant faire hériter votre WebPart avec :

public partial class VisualWebPart1UserControl : UserControl, ICallbackEventHandler

En effet l’interface de ICallbackEventHandler vous permet de rendre asynchrone la communication avec le serveur.

Il vous donne accès à 2 fonctions à implémenter :

public void RaiseCallbackEvent(string eventArgs)
{

    StringBuilder sb = new StringBuilder();
    SPSite mySite = SPContext.Current.Site;

    SPWebCollection subSites = mySite.AllWebs;
    this.data = mySite.Url.ToString() + "<BR>";
    for (int i = 0; i < subSites.Count; i++)
    {
        SPListCollection lists = subSites[i].Lists;

        for (int j = 0; j < lists.Count; j++)
        {
            sb.Append(subSites[i].Title + "--" + lists[j].Title + "<BR>");
            this.data = sb.ToString();
        }
    }
}

C’est votre fonction “lente” à exécuter, dans cette exemple. Je charge la liste de toutes les listes du site SharePoint, et je les affiche les unes à la suite des autres grâce au “<br>”

Un fois le calcul exécuté, la fonction :

public string GetCallbackResult()
{
    return this.data;
}

Vous renvoie le résultat.

Efficace et rapide à mettre en place.

Pour les plus curieux d’entre vous, les GridViews, DetailView… possèdent également une propriété ICallbackEventHandler. A vous d’aller plus loin pour l’utiliser avec ce genre de composant, une indice. Allez voir du côté d’IAsynResult !

A vous de jouer 😉

Répondre

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l'aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

%d blogueurs aiment cette page :