Filtrer une liste dynamiquement


Bonjour à tous,

Aujourd’hui je vais vous parler d’une demande que j’ai eue plus d’une fois dernièrement. Que ça soit chez mes clients ou sur les forums msdn
cette dernière est revenue plusieurs fois : « Comment filtrer une liste en fonction d’un paramètre entré par l’utilisateur ? »

Pour cela nous avons par défaut la webpart « TextFilter », seulement cette webpart a 2 défauts :

Premièrement vous avez besoin de la version Enterprise de SharePoint 2010, ensuite cette webpart fait du « égal à » et non pas du « contient » (alors que toutes les demandes que j’ai personnellement reçues demandaient un « contient »).

Je vais vous montrer un petit bout de code à utiliser dans une webpart pour que vos utilisateurs puissent filtrer vos listes.

L’idée consiste à charger une « ListViewWebpart » de la liste ciblée.

 
string listUrl = "Lists/maliste" ; 
SPList list = web.GetList(SPUrlUtility.CombineUrl(web.Url, listUrl)); 
ListViewWebPart lvwp = new ListViewWebPart(); 
lvwp.ListName = list.ID.ToString("B").ToUpper(); 
lvwp.ViewGuid = list.Views[YourCustomViewName].ID.ToString("B").ToUpper(); 
this.Controls.Add(lvwp); 

Avec ce bout de code vous afficherez la liste située à l’url « listUrl » avec la vue dont le nom est égal à « YourCustomViewName »

Si vous voulez afficher la vue par défaut, remplacer la ligne

 lvwp.ViewGuid = list.Views[YourCustomViewName].ID.ToString("B").ToUpper(); 

par

 lvwp.ViewGuid = list.DefaultView.ID.ToString("B").ToUpper(); 

Pour le filtre, nous allons utiliser 2 TextBox, 1 pour la colonne « LinkTitle » et l’autre pour la colonne « Prenom » et 1 bouton pour filtrer. L’astuce va consister à créer une CAML Query et à l’injecter dans la vue sélectionnée.

Attention, si la vue sélectionnée est déjà filtrée, le filtre existant sera remplacé. Autrement dit si vous avez une liste filtrée sur la colonne C, si vous utilisez le bout de code suivant, elle ne sera plus filtrée sur la colonne C mais sur les colonnes A et B.

Commençons par créer notre requête.

 
string query = string.Empty; 
string tempAdding = string.Empty; 
if (!string.IsNullOrEmpty(tbA.Text)) 
{ 
query = <Contains><FieldRef Name='A' /><Value Type='Text'>" + tbA.Text + "</Value></Contains>; 
} 
if (!string.IsNullOrEmpty(tbB.Text)) 
{ 
tempAdding = <Contains><FieldRef Name='B' /><Value Type='Text'>" + tbB.Text + "</Value></Contains>; 
query = (query.Length > 0 ? "<And>" + query + tempAdding + "</And>" : tempAdding); 
} 

Maintenant injectons la ! Pour ceci nous allons parcourir le xml de la vue afin de trouver le tag « Where » où nous allons remplacer la requête existante par la nouvelle.

 
XmlDocument doc = new XmlDocument(); 
doc.LoadXml(lvwp.ListViewXml); 
XmlNode queryNode = doc.SelectSingleNode("//Query"); 
XmlNode whereNode = queryNode.SelectSingleNode("Where"); 
if (whereNode != null) queryNode.RemoveChild(whereNode); 
XmlNode newNode = doc.CreateNode(XmlNodeType.Element, "Where", String.Empty); 
newNode.InnerXml = query.ToString(); 
queryNode.AppendChild(newNode); 
lvwp.ListViewXml = doc.OuterXml; 

Nous n’avons plus qu’à mettre tout ça dans un update panel et nous voila avec une webpart de filtre personnalisée!

Libre à vous d’aller plus loin et de mettre l’url de la liste, la vue et les champs en paramètres de la webpart pour avoir une webpart de filtre aussi générique que possible !

Pour finir voici le code complet de ma webpart.

 

 public class WebPart1 : System.Web.UI.WebControls.WebParts.WebPart
    {
        //Controls
        TextBox tbA;
        TextBox tbB;
        Button filterButton;
        UpdatePanel mainUpdatePanel;
        ListViewWebPart lvwp;
        SPList list;

        protected override void CreateChildControls()
        {
            mainUpdatePanel = new UpdatePanel();
            mainUpdatePanel.UpdateMode = UpdatePanelUpdateMode.Conditional;

            tbA = new TextBox();
            tbB = new TextBox();

            list = SPContext.Current.Web.GetList(SPUrlUtility.CombineUrl(SPContext.Current.Web.Url, "Lists/FilterList"));
            lvwp = new ListViewWebPart();
            lvwp.ListName = list.ID.ToString("B").ToUpper();
            lvwp.ViewGuid = list.DefaultView.ID.ToString("B").ToUpper();
            lvwp.ChromeType = PartChromeType.None;




            filterButton = new Button();
            filterButton.Text = "Filter";
            filterButton.Click += new EventHandler(filterButton_Click);


            Controls.Add(new LiteralControl(" Nom : "));
            Controls.Add(tbA);
            Controls.Add(new LiteralControl(" Prenom : "));
            Controls.Add(tbB);
            mainUpdatePanel.ContentTemplateContainer.Controls.Add(filterButton);
            mainUpdatePanel.ContentTemplateContainer.Controls.Add(lvwp);

     
            this.Controls.Add(mainUpdatePanel);
        }

        private void filterButton_Click(object sender, EventArgs e)
        {
            string query = string.Empty;
            string tempAdding = string.Empty;
            if (!string.IsNullOrEmpty(tbA.Text))
            {
                query = "<Contains><FieldRef Name='LinkTitle' /><Value Type='Text'>" + tbA.Text + "</Value></Contains>";
            }
            if (!string.IsNullOrEmpty(tbB.Text))
            {
                tempAdding = "<Contains><FieldRef Name='Prenom' /><Value Type='Text'>" + tbB.Text + "</Value></Contains>";
                query = (query.Length > 0 ? "<And>" + query + tempAdding + "</And>" : tempAdding);
            }

            XmlDocument doc = new XmlDocument();
            doc.LoadXml(lvwp.ListViewXml);
            XmlNode queryNode = doc.SelectSingleNode("//Query");
            XmlNode whereNode = queryNode.SelectSingleNode("Where");

            if (whereNode != null) queryNode.RemoveChild(whereNode);
            XmlNode newNode = doc.CreateNode(XmlNodeType.Element, "Where", String.Empty);
            newNode.InnerXml = query.ToString();
            queryNode.AppendChild(newNode);
            lvwp.ListViewXml = doc.OuterXml;

        }

Christopher.

Cet article, publié dans SharePoint 2010, est tagué , , , . Ajoutez ce permalien à vos favoris.

Laisser un commentaire

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 )

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 )

Photo Google+

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

Connexion à %s