Share via


Procédure : utiliser le composant WebPart Filtre CheckBox à sélections multiples

Dans cette rubrique, examinons la création d'un composant WebPart Filtre qui affiche des titres d'actualités filtrés en fonction des régions sélectionnées dans le composant WebPart Filtre de régions qui lui est associé.

Notes

Le composant WebPart Filtre de régions est décrit dans Procédure : écrire un composant WebPart Filtre de case à cocher à sélection multiple.

Outre la création d'une interface utilisateur avec un contrôle DataGrid pour afficher les titres, les étapes à suivre pour créer le composant WebPart Filtre de titres (Headlines Filter Consumer) sont les suivantes :

  1. Créer une instance d'interface ConsumerParameters pour indiquer au fournisseur du filtre les noms des paramètres. Windows SharePoint Services 3.0 utilisera cette interface pour remplir l'interface utilisateur pour la connexion des composants WebPart au moment de l'exécution.

  2. Exposer un point de connexion de consommateur pour demander l'interface IFilterValues à partir du composant WebPart de fournisseur de filtre.

  3. Utiliser l'interface dans PreRender() et afficher la valeur de filtre actuelle.

  4. Vous pouvez tester ce composant WebPart en vous connectant au filtre de régions ou en utilisant un composant WebPart Filtre prêt à l'emploi tels que le filtre Texte ou le filtre Liste créée.

    Notes

    Vous aurez également besoin du composant WebPart Actions de filtre pour tester cet exemple. Le composant WebPart Filtrer les actions fournit un bouton Appliquer des filtres que vous pouvez utiliser pour appliquer des filtres sur la page.

Voici l'exemple de code pour le composant WebPart Consommateur. Suivez les instructions de la procédure pas à pas : Procédure pas à pas : écriture d'un exemple de composant WebPart Filtre consommateur simple pour déployer ce composant WebPart.

Exemple

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using aspnetwebparts = System.Web.UI.WebControls.WebParts;
using Microsoft.Office.Server.Utilities;
using wsswebparts = Microsoft.SharePoint.WebPartPages;
using Microsoft.SharePoint.Portal.WebControls;
using System.Collections.ObjectModel;
using Microsoft.SharePoint.Utilities;
using System.Data;
using System.Collections;

namespace MyWebPartLibrary
{
    public class DataBoundHeadlinesFilterConsumerWebPart : aspnetwebparts.WebPart
    {

        public class Headline
        {
            private string title;
            private string region;

            public Headline(string Title, string Region)
            {

                this.title = Title;
                this.region = Region;

            }
            public string Title
            {
                get
                {
                    return this.title;
                }
                set
                {
                    this.title = value;
                }
            }

            public string Region
            {
                get
                {
                    return this.region;
                }
                set
                {
                    this.Region = value;
                }
            }



        }

        List<wsswebparts.IFilterValues> providers = new List<wsswebparts.IFilterValues>();
        List<Headline> headlines;
       
        DataGrid DataListHeadlines;

        protected override void CreateChildControls()
        {
            DataListHeadlines = new DataGrid();

            headlines = new List<Headline>();

            headlines.Add(new Headline("This week in Redmond", "Redmond"));
            headlines.Add(new Headline("Traffic in Redmond", "Redmond"));
            headlines.Add(new Headline("Sports highlights in Redmond", "Redmond"));
            headlines.Add(new Headline("Bitter cold, wind to follow today's snow", "Seattle"));
            headlines.Add(new Headline("This week in Seattle", "Seattle"));
            headlines.Add(new Headline("Sports News in US", "US"));
            headlines.Add(new Headline("This week in the US", "US"));
            headlines.Add(new Headline("This week in the world", "World"));
            headlines.Add(new Headline("Last week sports highlights", "World"));


            DataListHeadlines.ID = "list1";
            Controls.Add(DataListHeadlines);

            base.CreateChildControls();
        }


        [aspnetwebparts.ConnectionConsumer("Headlines Filter", "IFilterValues", AllowsMultipleConnections = true)]
        public void SetConnectionInterface(wsswebparts.IFilterValues provider)
        {
            if (provider != null)
            {
                this.providers.Add(provider);

                List<wsswebparts.ConsumerParameter> l = new List<wsswebparts.ConsumerParameter>();
                l.Add(new wsswebparts.ConsumerParameter("Region", 
                    wsswebparts.ConsumerParameterCapabilities.SupportsMultipleValues | wsswebparts.ConsumerParameterCapabilities.SupportsAllValue));

                provider.SetConsumerParameters(new ReadOnlyCollection<wsswebparts.ConsumerParameter>(l));
            }
        }

        protected override void OnPreRender(EventArgs e)
        {
            this.EnsureChildControls();

            // The filtering logic is to perform a union of all of the filters
            // (a logical OR). 
            // If we didn't get any filter providers or if any of the filters 
            // send the "All" value (i.e. if provider.ParameterValues == null)
            // then we don't need to filter and we can just send back all of 
            // the headlines.
            
            List<Headline> filteredHeadlines = null;

            bool shouldFilter = true;
            if (this.providers.Count == 0)
            {
                shouldFilter = false;
            }
            else if (this.providers.Count > 0)
            {
                foreach( wsswebparts.IFilterValues filter in this.providers)
                {
                    if (filter.ParameterValues == null)
                    {
                        // Some filter sent "All" - don't bother with the rest
                        // of the filtering.
                        shouldFilter = false;
                        break;
                    }
                }
            }
            

            if (!shouldFilter)
            {
                // the "filtered" headlines are unfiltered.
                filteredHeadlines = this.headlines;
            }
            else
            {
                // Just fill in the headlines that match the filters.

                filteredHeadlines = new List<Headline>();

                // Create a lookup from region to a list of headlines which 
                // correspond to that region.
                Dictionary<string, List<Headline>> regionHeadlineMap = new Dictionary<string,List<Headline>>();
                foreach (Headline headline in this.headlines)
                {
                    List<Headline> headlinesForRegion = null;
                    if (!regionHeadlineMap.TryGetValue(headline.Region, out headlinesForRegion))
                    {
                        headlinesForRegion = new List<Headline>();
                        regionHeadlineMap.Add(headline.Region, headlinesForRegion);
                    }

                    headlinesForRegion.Add(headline);
                }

                foreach (wsswebparts.IFilterValues provider in this.providers)
                {

                    ReadOnlyCollection<String> values = provider.ParameterValues;
                    if (values != null)
                    {
                        foreach (string v in values)
                        {
                            if (v == null)
                            {
                                // This indicates the "Empty" value, which this
                                // doesn't apply to headlines, since they all 
                                // have a Region.
                            }
                            else
                            {
                                List<Headline> matchedHeadlines;
                                if (regionHeadlineMap.TryGetValue(v, out matchedHeadlines))
                                {
                                    foreach (Headline matchedHeadline in matchedHeadlines)
                                    {
                                        if (!filteredHeadlines.Contains(matchedHeadline))
                                        {
                                            filteredHeadlines.Add(matchedHeadline);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            // Display the filtered headlines.
            DataListHeadlines.DataSource = filteredHeadlines;
            DataListHeadlines.DataBind();

            base.OnPreRender(e);
        }
    }
}

Voir aussi

Autres ressources

Procédure : écrire un composant WebPart Filtre de case à cocher à sélection multiple