January 16, 2008

Champs "liste déroulante" dans les propriétés d'une WebPart Sharepoint

Posted by

Manuel Diaz

J’ai cherché un moment avant de trouver la solution et aujourd’hui, je partage un exemple complet avec vous.
Comment réaliser une webpart pour sharepoint avec dans ses propriétés une liste déroulante avec un contenu dynamique et non pas simplement des champs textes de bases ou des listes statiques créées à partir d’énumération ? Et voici :


Dans notre exemple, on affiche dans notre dropdownlist toutes les listes du site courant, puis dans le rendu de la webpart, on affiche simplement le titre de la liste récupérée (c’est un exemple 😉 ).
Ajouter dans un premier temps les références à Microsoft.Sharepoint et System.Web puis c’est parti :
using System;
using System.Runtime.InteropServices;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Serialization;
using System.Collections;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.WebPartPages;
using Microsoft.SharePoint.Navigation;
using Microsoft.SharePoint.Utilities;
using System.ComponentModel;
namespace WebPartProjects
{
[ToolboxData(“<{0}:DynamicList runat=server>“),
XmlRoot(Namespace = “WebPartProjects”)]
public class DynamicList : Microsoft.SharePoint.WebPartPages.WebPart
{
// Variable qui contiendra la value de notre liste
private string _newlistname;
[Browsable(false),
WebPartStorage(Storage.Shared)]
public string NewListName
{
get { return _newlistname; }
set { _newlistname = value; }
}
public DynamicList()
{
_newlistname = “”;
}
protected override void OnPreRender(EventArgs e)
{
this.Title = “Liste dynamique”;
this.ChromeType = PartChromeType.None;
}
protected override void CreateChildControls()
{
base.CreateChildControls();
}
public override ToolPart[] GetToolParts()
{
ToolPart[] toolparts = new ToolPart[3];
WebPartToolPart wptp = new WebPartToolPart();
CustomPropertyToolPart custom = new CustomPropertyToolPart();
toolparts[0] = custom;
toolparts[1] = wptp;
toolparts[2] = new ListListes();
return toolparts;
}
protected override void RenderWebPart(HtmlTextWriter writer)
{
EnsureChildControls();
try
{
if (_newlistname == “”)
{
writer.Write(“Sélectionnez un élément dans la liste en affichant les propriétés de la webpart”);
}
else
{
SPWeb web = SPContext.Current.Web;
SPList laListe = web.Lists[new Guid(_newlistname)];
// On affiche simplement le titre de notre liste que l’on a récupéré par notre liste déroulante
writer.Write(laListe.Title);
}
}
catch
{
writer.Write(“Erreur, liste n’existe pas ou plus ? “);
}
}
}
class ListListes : Microsoft.SharePoint.WebPartPages.ToolPart
{
DynamicList ParentWp = null;
Label ErrorMessage = null;
public ListListes()
{
this.Title = “Liste dynamique”;
}
protected override void OnPreRender(EventArgs e)
{
this.Title = “Listes du site”;
}
public override void ApplyChanges()
{
// Lorsque l’on clique sur Appliquer (ou implicitement su OK)
// On enregistre la valeur de la liste déroulante
string FieldName = Page.Request.Form[“ListesField”];
ParentWp = (DynamicList)this.ParentToolPane.SelectedWebPart;
ParentWp.NewListName = FieldName;
}
protected override void CreateChildControls()
{
ErrorMessage = new Label();
ErrorMessage.Style.Add(HtmlTextWriterStyle.Color, “red”);
this.Controls.Add(ErrorMessage);
}
public override void SyncChanges()
{
}
public override void CancelChanges()
{
}
protected override void RenderToolPart(HtmlTextWriter output)
{
try
{
ParentWp = (DynamicList)this.ParentToolPane.SelectedWebPart;
SPWeb web = SPContext.Current.Web;
// on regarde si des listes sont dispo :
if (web.Lists.Count > 0)
{
output.Write(“<select name=’ListesField’>”);
foreach (SPList liste in web.Lists)
{
if (ParentWp.NewListName == liste.ID.ToString())
output.Write(“<option value=\”” + liste.ID.ToString() + “\” selected>” + liste.Title + “</option>”);
else output.Write(“<option value=\”” + liste.ID.ToString() + “\”>” + liste.Title + “</option>”);
}
output.Write(“</select>”);
}
else
{
output.Write(“Aucune liste disponible”);
}
}
catch (Exception e)
{
ErrorMessage.Text = e.Message;
}
ErrorMessage.RenderControl(output);
}
}
}
Je sais, ça fait beaucoup, mais y’a pas qu’Alexis qui a droit au coup de pelle non ?
Enfin j’ai triché, avec du code, c’est plus facile 😉

cyril poulet

Bonjour
J’essaie d’implementer votre code dans une webpart. Tout compile, s’exporte et la solution s’installe sans probleme, mais impossible de trouver la nouvelle webpart depuis mon site sharepoint par la suite (malgré un redémarrage des services IIS).
Ai-je manqué quelque chose ?
Merci !

Cedric Gavand

Où regardez-vous si votre webpart apparaît ? Dans l’admin/galeries/composants webparts ou dans la liste des webparts lorsque vous essayez d’ajouter une webpart sur une page par exemple ?

Maxime LECOEUR

bonjour,
PortalSharepoint.DynamicList is a ‘namespace’ but is used like a ‘type.’
savez vous comment le faire prendre en compte comme un type ?
merci
Maxime LECOEUR