Home > C#

SharePoint 2010 : Connexion des WebParts

 

 

image

 

Parfois il est nécessaire de faire communiquer des WebParts entre elles. Le but est de faire passer les données d’une WebPart à une autre.

 

Pour faire communiquer des WebParts il faudra impérativement savoir ce que l’on souhaite communiquer. Cela sera définit par un contrat, soit une interface.

 

Il faudra également créer :

- une WebPart qui jouera le rôle de fournisseur également appelé Provider WebPart

- une WebPart qui jouera le rôle de consommateur/utilisateur des données qu’elle va recevoir. Est également appelé Consumer WebPart.

 

Techniquement parlant, la Provider WebPart retournera une instance de l’interface.

Alors que la Consumer WebPart comme vous vous en doutez possèdera une instance de l’interface. On pourra donc grâce à cet objet agir sur les données reçues.

image

 

Plan de cet article :

1) Création de l’interface

2) Création de la WebPart Provider

3) Création de la WebPart Consumer

4) Les connecter entre-elles via l’interface Web de Sharepoint 2010

5) Conclusion

 
 
 
Tout au long de cet article je me baserais sur des données qui sont dans une simple custom list. Cette custom list “Ranks” possède 2 colonnes : Title et Population.
 

image

 

1) Création de l’interface

 

public interface IRanks
{
String CountryName { get; }
Int32 Population { get; }
}

 

Je vais donc vouloir communiquer le nom du pays et sa population.



2) Création de la WebPart Provider

Rappelez-vous la WebPart Provider retournera une instance de l’interface.

La première chose à faire est de dériver notre classe de “IRanks”:

 

public class ProviderWebPart : WebPart, IRanks

 

 

J’implémente l’interface :

- dans la première propriété je récupère l’item selectionné dans ma dropdownlist,

- dans la seconde je récupère la valeur associée à l’item selectionné. Ici la population du pays.

DropDownList _ddlCountry = null;

#region Implémentation de l'interface IRanks
public string CountryName
{
get { return _ddlCountry.SelectedItem.ToString(); }
}

public int Population
{
get { return int.Parse(_ddlCountry.SelectedValue); }
}
#endregion
Le code :
Label _lbl = null;
LiteralControl _literal = null;
Label _lbl2 = null;

/// <summary>
/// C'est ici que l'on écrit notre logique
/// et surtout que l'on va créer/instancier nos contrôles ASP.NET
/// </summary>
protected override void CreateChildControls()
{
try
{
_ddlCountry = new DropDownList();
_ddlCountry.Items.Add(new ListItem());

// Récupère le site courant
using (SPSite spSite = new SPSite(SPContext.Current.Web.Url))
{
// Ouvre le site courant
using (SPWeb spWeb = spSite.OpenWeb())
{
// Récupère la liste "Ranks" dans le site courant
SPList rankList = spWeb.Lists["Ranks"];

// Itère sur les objets de ma liste
foreach (SPListItem rank in rankList.Items)
{
// récupére les données dans la colonne "Title"
// et dans la colonne "Population" de ma liste "Ranks"
_ddlCountry.Items.Add(new ListItem
(
rank.Title,
rank["Population"].ToString()
));
}
}
}

_ddlCountry.AutoPostBack = true;
_ddlCountry.SelectedIndexChanged +=
new EventHandler(_projectPicker_SelectedIndexChanged);

this.Controls.Add(_ddlCountry);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}

void _projectPicker_SelectedIndexChanged(object sender, EventArgs e)
{
_lbl = new Label();
_literal = new LiteralControl("<br/>");
_lbl2 = new Label();

_lbl.Text = "Pays selectionné : "
+ _ddlCountry.SelectedItem.ToString() + " || ";
_lbl2.Text = "Nombre d'habitants : " + _ddlCountry.SelectedValue;

this.Controls.Add(_literal);
this.Controls.Add(_lbl);
this.Controls.Add(_lbl2);
}

 

Et le plus important : pour dire que cette WebPart sera la WebPart Consumer il faut écrire ce petit bout de code :

[ConnectionProvider("Ranks service Provider")]
public IRanks RanksProvider()
{
return this as IRanks;
}

Il est donc à noter que la WebPart Provider à besoin d’être décoré de l’attribut 

[ConnectionProvider(“displayName”)].

 

Nous avons terminé avec la WebPart Provider.

 

 

3) Création de la WebPart Consumer

 

Cette fois ci on commence par le plus important :

 

[ToolboxItemAttribute(false)]
public class ConsumerWebPart : WebPart
{
IRanks _provider = null;
Label _lbl = null;

/// <summary>
/// On initialise le fournisseur.
/// </summary>
/// <param name="providerInterface"></param>
[ConnectionConsumer("Ranks service Consumer")]
public void InitializeProvider(IRanks providerInterface)
{
_provider = providerInterface;

}
}

 

Ici notre méthode est décorée de l’attribut

[ConnectionConsumer("displayName")].

 

Le code qui permet d’afficher bêtement les données avec l’objet _provider :

 

 

protected override void CreateChildControls()
{
try
{
_lbl = new Label();
if (_provider != null)
{
if (!(string.IsNullOrEmpty(_provider.CountryName)))
{
_lbl.Text = "Le pays selectionné : " + _provider.CountryName
+ " possède " + _provider.Population + " habitants.";
}
}
this.Controls.Add(_lbl);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}

 

 

Nous avons terminé avec notre WebPart Consumer.

 

 

4) Les connecter entre-elles via l’interface Web de Sharepoint 2010

 

Déployer votre solution et rendez-vous sur votre site Sharepoint 2010. Edité la page et ajouter aux endroits souhaités vos 2 WebParts.

 

AddWebpart

 

 

Après avoir ajouté les 2 WebParts, il vous faudra les inter-connecter manuellement de cette manière :

 

ConnectWebPart

 

 

Le résultat :

 

Result

 

5) Conclusion

 

Ici nous avons utilisés des WebParts classiques (pas des Visual WebParts). Sachez que si vous souhaitez développer et gérer la communication entre des WebParts qu’elles soient classiques ou visuelles (.ascx) cela se fera de la même manière.

La où il faudra faire attention c’est au niveau du déploiement de votre solution : sandboxé ou au niveau de la ferme.
Les Visual WebParts ne se déploient qu’au niveau de la ferme ce qui implique d’avoir accès à l’administration centrale de SharePoint.

 

 

Charles.

C#

Add comment




  Country flag

biuquote
  • Comment
  • Preview
Loading

captcha

*