Partager via


Procédure : Créer des éditeurs pour les filtres des services PerformancePoint Services

Dernière modification : mardi 30 août 2011

Dans Services PerformancePoint dans Microsoft SharePoint Server 2010, les éditeurs personnalisés permettent aux utilisateurs de définir des propriétés sur des objets personnalisés en procurant des contrôles d’édition et une fonctionnalité d’extraction et de mise à jour d’objets personnalisés dans le référentiel. Pour plus d’informations sur la fonctionnalité et les exigences de l’éditeur, voir Éditeurs pour les objets personnalisés des services PerformancePoint Services.

S’applique à : SharePoint Server 2010

Les éditeurs de filtres doivent également initialiser la propriété BeginPoints d’un filtre, qui définit le point de départ du filtre qui contient les valeurs de paramètres des consommateurs de rapports et de cartes de performances.

Les procédures et exemples de cette rubrique sont basés sur la classe SampleFilterEditor de l’exemple d’objets personnalisés. L’éditeur est une application Web légère qui permet aux utilisateurs de modifier le nom et la description du filtre et de sélectionner la source de données sous-jacente. Le code complet de la classe est fourni dans la section « Exemple » de cette rubrique.

Notes

Nous vous recommandons d’utiliser l’éditeur d’exemple comme modèle. L’exemple montre comment appeler des objets dans l’API PerformancePoint Services, fournit des objets d’assistance qui simplifient les appels pour les opérations de référentiels (telles que la création et la mise à jour d’objets) et illustre les meilleures pratiques pour le développement PerformancePoint Services.

La création d’un éditeur de filtre nécessite d’effectuer les deux procédures de base suivantes :

  • Création et configuration de la classe d’éditeur

  • Définition de la fonctionnalité d’édition

Pour créer un éditeur personnalisé, commencez par créer la classe d’éditeur.

Pour créer et configurer la classe d’éditeur

  1. Installez PerformancePoint Services ou copiez les DLL utilisées par votre extension (répertoriées à l’étape 3) sur votre ordinateur. Pour plus d’informations, voir DLL PerformancePoint Services utilisées dans les scénarios de développement.

  2. Dans Visual Studio, créez une bibliothèque de classes C#. Si vous avez déjà créé une bibliothèque de classes pour votre extension, ajoutez une nouvelle classe C#.

  3. Ajoutez les DLL PerformancePoint Services et SharePoint Server 2010 suivantes en tant que références d’assemblys au projet :

    • Microsoft.PerformancePoint.Scorecards.Client.dll

    • Microsoft.PerformancePoint.Scorecards.ServerCommon.dll

    • Microsoft.PerformancePoint.Scorecards.ServerRendering.dll

    • Microsoft.PerformancePoint.Scorecards.Store.dll (utilisé par les classes d’assistance)

    • Microsoft.SharePoint.dll (utilisé par les classes d’assistance)

    L’exemple d’éditeur contient également des références d’assemblys à System.Web.dll et System.Web.Services.dll. Selon la fonctionnalité de l’extension, il se peut que d’autres références de projets soient requises.

  4. Ajoutez les classes suivantes de l’exemple au projet. L’éditeur utilise ces classes d’assistance pour interagir avec le référentiel PerformancePoint Services :

    • DataSourceConsumerHelper.cs

    • ExtensionRepositoryHelper.cs

    • FilterRepositoryHelper.cs

    • IDataSourceConsumer.cs

  5. Dans votre classe d’éditeur, ajoutez des directives using pour les espaces de noms PerformancePoint Services suivants :

    • Microsoft.PerformancePoint.Scorecards

    • Microsoft.PerformancePoint.Scorecards.ServerCommon

    • Microsoft.PerformancePoint.Scorecards.ServerRendering

    Selon la fonctionnalité de votre extension, il se peut que d’autres directives using soient requises.

  6. Héritez de la classe de base qui prend en charge votre implémentation d’éditeur. L’exemple d’éditeur de filtre étant une application Web, il hérite de la classe Page. D’autres implémentations peuvent dériver de classes de base telles que UserControl ou WebPart.

Après avoir créé et configuré la classe d’éditeur, vous devez définir la fonctionnalité de votre éditeur.

Pour définir la fonctionnalité d’édition

  1. Définissez des contrôles qui exposent les propriétés que vous souhaitez que les utilisateurs affichent ou modifient. L’exemple d’éditeur de filtre déclare d’abord des variables pour les contrôles de serveur Web définis dans le composant d’interface utilisateur, qui est une page ASPX. Il définit également un contrôle de bouton qui permet aux utilisateurs de soumettre des modifications. Ensuite, il appelle la méthode CreateChildControls() afin de rendre les contrôles disponibles sur la page.

    Notes

    L’éditeur définit la logique de programmation séparément de l’interface utilisateur. Les instructions de création du composant d’interface utilisateur sont au-delà de la portée de cette documentation.

  2. Affectez la valeur true à la propriété AllowUnsafeUpdates. Cela permet à l’éditeur de filtre d’écrire des données dans le référentiel sans utiliser d’opérations POST de formulaire.

    L’exemple d’éditeur de filtre effectue les étapes 2 à 6 dans la méthode Page_Load. Page_Load sert également à initialiser et valider des variables et des contrôles, à remplir des contrôles et à enregistrer les informations d’état pour les objets d’assistance et de filtre personnalisés.

  3. Extrayez les paramètres de la chaîne de requête, puis définissez-les comme valeurs pour des variables locales, comme illustré dans l’exemple de code suivant.

    // The URL of the site collection that contains the PerformancePoint Services repository.
    string server = Request.QueryString[ClickOnceLaunchKeys.SiteCollectionUrl];
    
    // The location of the filter in the repository.
    string itemLocation = Request.QueryString[ClickOnceLaunchKeys.ItemLocation];
    
    // The operation to perform: OpenItem or CreateItem.
    string action = Request.QueryString[ClickOnceLaunchKeys.LaunchOperation];
    
    ' The URL of the site collection that contains the PerformancePoint Services repository.
    Dim server As String = Request.QueryString(ClickOnceLaunchKeys.SiteCollectionUrl)
    
    ' The location of the filter in the repository.
    Dim itemLocation As String = Request.QueryString(ClickOnceLaunchKeys.ItemLocation)
    
    ' The operation to perform: OpenItem or CreateItem.
    Dim action As String = Request.QueryString(ClickOnceLaunchKeys.LaunchOperation)
    

    Pour plus d’informations sur les paramètres de chaîne de requête, voir Éditeurs pour les objets personnalisés des services PerformancePoint Services.

  4. Extrayez l’objet FilterRepositoryHelper, qui est utilisé pour effectuer des appels au référentiel, comme illustré dans l’exemple de code suivant.

    filterRepositoryHelper = new FilterRepositoryHelper();
    
    filterRepositoryHelper = New FilterRepositoryHelper()
    
  5. Définissez l’emplacement de filtre en fonction du paramètre de chaîne de requête, comme illustré dans l’exemple de code suivant.

    RepositoryLocation repositoryFilterLocation = RepositoryLocation.CreateFromUriString(itemLocation);
    
    Dim repositoryFilterLocation As RepositoryLocation = RepositoryLocation.CreateFromUriString(itemLocation)
    
  6. Extrayez l’opération à effectuer (OpenItem ou CreateItem) de la chaîne de requête, puis extrayez ou créez le filtre personnalisé, comme illustré dans l’exemple de code suivant.

    if (ClickOnceLaunchValues.OpenItem.Equals(action, StringComparison.OrdinalIgnoreCase))
    {
    
                    // Use the repository-helper object to retrieve the filter.
                    filter = filterRepositoryHelper.Get(repositoryFilterLocation);
                    if (filter == null)
                    {
                        displayError("Could not retrieve the filter for editing.");
                        return;
                    }
     }
    else if (ClickOnceLaunchValues.CreateItem.Equals(action, StringComparison.OrdinalIgnoreCase))
    {
                    filter = new Filter
                    {
                        RendererClassName = typeof(MultiSelectTreeViewControl).AssemblyQualifiedName,
                        SubTypeId = "SampleFilter"
                    };
    }
    
    If ClickOnceLaunchValues.OpenItem.Equals(action, StringComparison.OrdinalIgnoreCase) Then
    
    ' Use the repository-helper object to retrieve the filter.
          filter = filterRepositoryHelper.Get(repositoryFilterLocation)
          If filter Is Nothing Then
               displayError("Could not retrieve the filter for editing.")
               Return
          End If
    
    ElseIf ClickOnceLaunchValues.CreateItem.Equals(action, StringComparison.OrdinalIgnoreCase) Then
          filter = New Filter With {.RendererClassName = GetType(MultiSelectTreeViewControl).AssemblyQualifiedName, .SubTypeId = "SampleFilter"}
    End If
    
    • Pour extraire le filtre personnalisé, utilisez la méthode FilterRepositoryHelper.Get.

    • Pour créer le filtre personnalisé, utilisez le constructeur Filter() et définissez les propriétés Name, RendererClassName et SubTypeId du filtre. SubTypeId est l’identificateur unique du filtre et doit correspondre à l’attribut subType que vous spécifiez pour votre filtre personnalisé dans le fichier web.config PerformancePoint Services. RendererClassName est le nom qualifié complet de la classe qui définit le contrôle serveur Web convertisseur. Si elle n’est pas définie dans l’éditeur, cette valeur est par défaut la classe de convertisseur spécifiée dans le fichier web.config.

    Notes

    Par défaut, les utilisateurs peuvent créer des objets personnalisés uniquement à partir de PerformancePoint Dashboard Designer. Pour permettre aux utilisateurs de créer un objet personnalisé en dehors de Dashboard Designer, vous devez ajouter un élément de menu qui envoie une demande CreateItem à votre éditeur à partir du type de contenu dans le référentiel. Pour plus d’informations, voir Éditeurs pour les objets personnalisés des services PerformancePoint Services.

  7. Extrayez la source de données sous-jacente du filtre à partir du référentiel. L’exemple d’éditeur de filtre utilise la propriété FilterRepositoryHelper.DataSourceHelper pour appeler la méthode DataSourceConsumerHelper.GetDataSource, qui sert à extraire la source de données en fonction de son emplacement dans le référentiel. Ceci est illustré dans l’exemple de code suivant.

    if (!string.IsNullOrEmpty(filter.DataSourceLocation.ItemUrl))
        {
            RepositoryLocation repositoryDatasourceLocation =
            RepositoryLocation.CreateFromUriString(filter.DataSourceLocation.ItemUrl);
            datasource =
            filterRepositoryHelper.DataSourceHelper.GetDataSource(repositoryDatasourceLocation);
        }
    
    If Not String.IsNullOrEmpty(filter.DataSourceLocation.ItemUrl) Then
          Dim repositoryDatasourceLocation As RepositoryLocation = RepositoryLocation.CreateFromUriString(filter.DataSourceLocation.ItemUrl)
          datasource = filterRepositoryHelper.DataSourceHelper.GetDataSource(repositoryDatasourceLocation)
    End If
    
  8. Pour permettre aux utilisateurs de sélectionner une source de données pour le filtre, remplissez le contrôle de sélection avec des sources de données PerformancePoint Services. La méthode PopulateDataSourceDropDown dans l’exemple d’éditeur de filtre appelle la méthode DataSourceConsumerHelper.GetDataSourcesBySourceNames pour extraire les sources de données. Ceci est illustré dans l’exemple de code suivant.

    // The parameter contains the default server-relative URL to the PerformancePoint Data Connections Library.
    // Edit this value if you are not using the default path. A leading forward slash may not be needed.
    ICollection dataSourceCollection =
    
    filterRepositoryHelper.DataSourceHelper.GetDataSourcesBySourceNames
        ("/BICenter/Data%20Connections%20for%20PerformancePoint/",
             new[] { "WSTabularDataSource", DataSourceNames.ExcelWorkbook });
    
    ' The parameter contains the default server-relative URL to the PerformancePoint Data Connections Library.
    ' Edit this value if you are not using the default path. A leading forward slash may not be needed.
    Dim dataSourceCollection As ICollection = filterRepositoryHelper.DataSourceHelper.GetDataSourcesBySourceNames ("("/BICenter/Data%20Connections%20for%20PerformancePoint/", { "WSTabularDataSource", DataSourceNames.ExcelWorkbook })
    

    L’exemple d’éditeur de filtre extrait deux types de sources de données, mais vous pouvez modifier cette méthode de façon à prendre en charge d’autres types de sources de données ou à inviter l’utilisateur à spécifier le type de source de données à extraire. Pour faire référence à une source de données native d’un type particulier, utilisez la propriété SourceName, qui renvoie un champ à partir de la classe DataSourceNames. Pour faire référence à une source de données personnalisée, utilisez la propriété SubTypeId de la source de données, qui a la même valeur que l’attribut subType enregistré dans le fichier web.config de PerformancePoint Services pour l’extension de source de données.

    Si vous modifiez cette méthode, vous devez apporter la modification correspondante dans la méthode GetDisplayDataInternal dans le fournisseur de données de l’exemple de filtre.

  9. Définissez le point de départ du filtre, qui est représenté par la propriété BeginPoints. Celle-ci définit la source des valeurs de filtre et est requise pour permettre au filtre d’envoyer des données aux cartes de performances et aux rapports.

    1. Créez un objet ParameterDefinition. BeginPoints renvoie un objet ParameterDefinitionCollection qui contient un seul objet ParameterDefinition.

    2. Pour spécifier le fournisseur de données du filtre, affectez comme valeur de la propriété ParameterProviderId l’identificateur unique du fournisseur de données. Cette valeur doit correspondre à celle renvoyée par la méthode GetId() du fournisseur de données.

    3. Pour spécifier la source des identificateurs clés pour les valeurs de filtre, affectez comme valeur de la propriété KeyColumn la colonne de la table de données d’affichage qui contient les identificateurs clés. L’exemple d’éditeur de filtre affecte comme valeur de cette propriété la colonne « Symbol ».

    4. Pour spécifier la source des valeurs d’affichage pour le contrôle de filtre, affectez comme valeur de la propriété DisplayColumn la colonne de la table de données d’affichage qui contient les valeurs d’affichage. L’exemple d’éditeur de filtre affecte comme valeur de cette propriété la colonne « Symbol ».

    Notes

    La table de données d’affichage est renvoyée par la propriété DisplayValues et est initialisée lorsque le fournisseur de données de filtre appelle la méthode GetDisplayDataInternal. Si la table de données contient d’autres colonnes, vous pouvez définir d’autres mappages de colonnes afin de fournir une fonctionnalité supplémentaire.

    if (0 == filter.BeginPoints.Count)
    {
        ParameterDefinition paramDef = new ParameterDefinition();
    
        // Reference the data provider.
        paramDef.ParameterProviderId = "SampleFilterDataProvider";
        paramDef.DefaultPostFormula = string.Empty;
    
        // Specify the column that contains the key identifiers and the column
        // that contains the display values. The sample uses the same column
        // for both purposes.
        // These values must match the structure of the data table that is
        // returned by the ParameterDefinition.DisplayValues property.
    
        paramDef.KeyColumn = "Symbol";
        paramDef.DisplayColumn = "Symbol";
    
        // You can use this property to store custom information for this filter.
        paramDef.CustomDefinition = string.Empty;
    
        filter.BeginPoints.Add(paramDef);
    }
    
    If 0 = filter.BeginPoints.Count Then
            Dim paramDef As New ParameterDefinition()
    
            ' Reference the data provider.
          paramDef.ParameterProviderId = "SampleFilterDataProvider"
          paramDef.DefaultPostFormula = String.Empty
    
            ' Specify the column that contains the key identifiers and the column
            ' that contains the display values. The sample uses the same column
            ' for both purposes.
            ' These values must match the structure of the data table that is
            ' returned by the ParameterDefinition.DisplayValues property.
    
          paramDef.KeyColumn = "Symbol"
          paramDef.DisplayColumn = "Symbol"
    
            ' You can use this property to store custom information for this filter.
          paramDef.CustomDefinition = String.Empty
    
          filter.BeginPoints.Add(paramDef)
    End If
    

    L’exemple d’éditeur définit son point de départ dans la méthode VerifyFilter. Il utilise également VerifyFilter pour vérifier que les propriétés requises sont définies et pour définir le mode de sélection, qui est une propriété facultative.

  10. Initialisez le filtre en exécutant la requête du filtre et en extrayant des données à partir de la source de données. La méthode buttonOK_Click dans l’exemple d’éditeur de filtre appelle la méthode FilterRepositoryHelper.GetParameterDisplayData pour initialiser le filtre.

    Notes

    L’éditeur doit appeler FilterRepositoryHelper.GetParameterDisplayData au moins une fois avant de mettre à jour l’objet filtre.

  11. Mettez à jour le filtre avec les modifications définies par l’utilisateur. La méthode buttonOK_Click dans l’exemple d’éditeur de filtre appelle la méthode FilterRepositoryHelper.Update pour mettre à jour les propriétés Name, Description et DataSourceLocation du filtre dans le référentiel. De plus, buttonOK_Click est utilisé pour valider le contenu des contrôles et extraire les informations d’état du filtre personnalisé et de l’objet d’assistance.

    Notes

    Les utilisateurs peuvent définir les propriétés Name, Description et Owner (Person Responsible) d’un objet personnalisé et supprimer des objets personnalisés directement à partir de Dashboard Designer et du référentiel PerformancePoint Services.

    Étape suivante : après avoir créé un éditeur de filtre (notamment son interface utilisateur, le cas échéant) et un fournisseur de données, déployez l’extension comme décrit dans Procédure : enregistrer manuellement des extensions PerformancePoint Services. Pour obtenir des instructions sur la façon d’installer et de configurer l’exemple d’extension de filtre, voir la section « Installation des objets de rapport, de filtre et de source de données de l’exemple » dans Exemple de code : objets personnalisés de rapport, de filtre et de source de données tabulaires.

Exemple

L’exemple de code suivant crée, extrait et met à jour des filtres personnalisés dans le référentiel et fournit la logique de programmation pour les contrôles définis dans une page ASPX.

Notes

Pour pouvoir compiler cet exemple de code, vous devez configurer votre environnement de développement comme décrit dans Pour créer et configurer la classe d’éditeur.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.PerformancePoint.Scorecards; 
using Microsoft.PerformancePoint.Scorecards.ServerCommon;
using Microsoft.PerformancePoint.Scorecards.ServerRendering;

namespace Microsoft.PerformancePoint.SDK.Samples.SampleFilter
{

    // Represents the class that defines the sample filter editor.
    public class SampleFilterEditor : Page
    {

        // Declare private variables for the ASP.NET controls defined in the user interface.
        // The sample's user interface is an ASPX page that defines the controls in HTML.
        private TextBox textboxName;
        private TextBox textboxDescription;
        private Label labelErrorMessage;
        private DropDownList dropdownlistDataSource;
        private Button buttonOK;
        private ListBox listboxStocks;

        // Make the controls available to this class.
        protected override void CreateChildControls()
        {
            base.CreateChildControls();

            if (null == textboxName) 
                textboxName = FindControl("textboxName") as TextBox;
            if (null == textboxDescription) 
                textboxDescription = FindControl("textboxDescription") as TextBox;
            if (null == dropdownlistDataSource) 
                dropdownlistDataSource = FindControl("dropdownlistDataSource") as DropDownList;
            if (null == labelErrorMessage)
                labelErrorMessage = FindControl("labelErrorMessage") as Label;
            if (null==buttonOK)
                buttonOK = FindControl("buttonOK") as Button;
            if (null==listboxStocks)
                listboxStocks = FindControl("listboxStocks") as ListBox;
        }

        // Handles the Load event of the Page control.
        // Methods that use a control variable should call the Control.EnsureChildControls
        // method before accessing the variable for the first time.
        protected void Page_Load(object sender, EventArgs e)
        {

            // Required to enable custom report and filter editors to
            // write data to the repository.
            ServerUtils.AllowUnsafeUpdates = true;

            // Initialize controls the first time the page loads only.
            if (!IsPostBack)
            {
                EnsureChildControls();
                FilterRepositoryHelper filterRepositoryHelper = null;
                try
                {

                    // Get information from the query string parameters.
                    string server = Request.QueryString[ClickOnceLaunchKeys.SiteCollectionUrl];
                    string itemLocation = Request.QueryString[ClickOnceLaunchKeys.ItemLocation];
                    string action = Request.QueryString[ClickOnceLaunchKeys.LaunchOperation];

                    // Validate the query string parameters.
                    if (string.IsNullOrEmpty(server) ||
                        string.IsNullOrEmpty(itemLocation) ||
                        string.IsNullOrEmpty(action))
                    {
                        displayError("Invalid URL.");
                        return;
                    }

                    // Retrieve the repository-helper object.
                    filterRepositoryHelper =
                        new FilterRepositoryHelper();

                    // Set the filter location.
                    RepositoryLocation repositoryFilterLocation = RepositoryLocation.CreateFromUriString(itemLocation);

                    Filter filter;
                    DataSource datasource = null;

                    // Retrieve or create the filter object, depending on the operation
                    // passed in the query string (OpenItem or CreateItem).
                    if (ClickOnceLaunchValues.OpenItem.Equals(action, StringComparison.OrdinalIgnoreCase))
                    {

                        // Retrieve the filter object by using the repository-helper object.
                        filter = filterRepositoryHelper.Get(repositoryFilterLocation);
                        if (filter == null)
                        {
                            displayError("Could not retrieve the filter for editing.");
                            return;
                        }

                    }
                    else if (ClickOnceLaunchValues.CreateItem.Equals(action, StringComparison.OrdinalIgnoreCase))
                    {

                        // Create a filter.
                        // CreateItem requests can be sent from a SharePoint list, but
                        // you must create a custom menu item to send the request.
                        // Dashboard Designer can send edit requests only.
                        filter = new Filter
                            {

                                // Specify the class that defines the renderer
                                // Web server control. The sample filter uses a native
                                // PerformancePoint Services renderer.
                                // Defaults to the value specified in the web.config file
                                RendererClassName = typeof(MultiSelectTreeViewControl).AssemblyQualifiedName,

                                // Specify the unique identifier for the filter.
                                // The SubTypeId property must match the
                                // subType attribute in the web.config file.
                                SubTypeId = "SampleFilter"
                            };
                    }
                    else
                    {
                        displayError("Invalid Action.");
                        return;
                    }

                    VerifyFilter(filter);

                    // Retrieve filter's underlying data source.
                    if (!string.IsNullOrEmpty(filter.DataSourceLocation.ItemUrl))
                    {
                        RepositoryLocation repositoryDatasourceLocation =
                            RepositoryLocation.CreateFromUriString(filter.DataSourceLocation.ItemUrl);
                        datasource =

                            // Gets a PerformancePoint Services data source by using the
                            // DataSourceHelper property to call the
                            // DataSourceConsumerHelper.GetDataSource method. 
                            filterRepositoryHelper.DataSourceHelper.GetDataSource(repositoryDatasourceLocation);
                    }

                    // Save the original filter and helper objects across page postbacks.
                    ViewState["action"] = action;
                    ViewState["filter"] = filter;
                    ViewState["filterrepositoryhelper"] = filterRepositoryHelper;
                    ViewState["itemlocation"] = itemLocation;

                    // Populate the child controls.
                    textboxName.Text = filter.Name.ToString();
                    textboxDescription.Text = filter.Description.ToString();

                    // Populate the dropdownlistDataSource control with data sources of specific
                    // types from the PerformancePoint Services repository.
                    // This method looks up the passed data source in the data sources
                    // that are registered in the web.config file. 
                    // Although the sample retrieves data sources of two specific types,
                    // you can modify it to prompt the user for a data source type.
                    PopulateDataSourceDropDown(datasource);

                    // Call the SelectedIndexChanged event directly to populate the 
                    // listbox control with preview data.
                    dropdownlistDataSource_SelectedIndexChanged(null, null);
                }
                catch (Exception ex)
                {
                    displayError("An error has occurred. Please contact your administrator for more information.");
                    if (filterRepositoryHelper != null)
                    {
                        // Add the exception detail to the server event log.
                        filterRepositoryHelper.HandleException(ex);
                    }
                }
            }
        }

        // Handles the SelectedIndexChanged event of the dropdownlistDataSource control.
        protected void dropdownlistDataSource_SelectedIndexChanged(object sender, EventArgs e)
        {
            EnsureChildControls();

            // Check if a valid data source is selected.
            if (null != dropdownlistDataSource.SelectedItem &&
                !string.IsNullOrEmpty(dropdownlistDataSource.SelectedItem.Text))
            {
                // Retrieve the data source object.
                FilterRepositoryHelper filterRepositoryHelper =
                    (FilterRepositoryHelper)ViewState["filterrepositoryhelper"];
                string selectedDataSourceItemUrl = dropdownlistDataSource.SelectedItem.Value;

                RepositoryLocation repositoryDatasourceLocation =
                    RepositoryLocation.CreateFromUriString(selectedDataSourceItemUrl);
                DataSource datasource = filterRepositoryHelper.DataSourceHelper.GetDataSource(repositoryDatasourceLocation);
                ViewState["datasource"] = datasource;

                // Populate the listboxStocks control with the preview data for the selected
                // data source.
                PopulateListBoxData(datasource);
            }
            else
            {
                ClearStocksListBox();
            }
        }

        // Clears the listboxStocks control.
        // The sample filter works with a Web service that provides stock information.
        private void ClearStocksListBox()
        {
            listboxStocks.DataSource = null;
            listboxStocks.DataBind();
            listboxStocks.Items.Clear();
        }

        // Handles the Click event of the buttonOK control.
        protected void buttonOK_Click(object sender, EventArgs e)
        {
            EnsureChildControls();

            // Verify that the controls contain values.
            if (string.IsNullOrEmpty(textboxName.Text))
            {
                labelErrorMessage.Text = "A filter name is required.";
                return;
            }
            if (dropdownlistDataSource.SelectedIndex == 0)
            {
                labelErrorMessage.Text = "A data source is required.";
                return;
            }

            // Clear any pre-existing error message.
            labelErrorMessage.Text = string.Empty;

            // Retrieve the filter, data source, and helper objects from view state.
            string action = (string)ViewState["action"];
            string itemLocation = (string) ViewState["itemlocation"];
            Filter filter = (Filter)ViewState["filter"];
            DataSource datasource = (DataSource)ViewState["datasource"];
            FilterRepositoryHelper filterRepositoryHelper = (FilterRepositoryHelper)ViewState["filterrepositoryhelper"];

            // Update the filter object with form changes.
            filter.Name.Text = textboxName.Text;
            filter.Description.Text = textboxDescription.Text;
            filter.DataSourceLocation = datasource.Location;
            foreach (ParameterDefinition parameterDefinition in filter.BeginPoints)
            {
                parameterDefinition.DisplayName = filter.Name.Text;
            }

            // Initialize the filter. This method runs the filter's query and retrieves preview data.
            filterRepositoryHelper.GetParameterDisplayData(ref filter);

            // Save the filter object to the PerformancePoint Services repository.
            try
            {
                filter.Validate();

                if (ClickOnceLaunchValues.CreateItem.Equals(action,StringComparison.OrdinalIgnoreCase))
                {
                    Filter newFilter = filterRepositoryHelper.Create(
                        string.IsNullOrEmpty(filter.Location.ItemUrl) ? itemLocation : filter.Location.ItemUrl, filter);
                    ViewState["filter"] = newFilter;
                    ViewState["action"] = ClickOnceLaunchValues.OpenItem;
                }
                else
                {
                    filterRepositoryHelper.Update(filter);
                }
            }
            catch (Exception ex)
            {
                displayError("An error has occurred. Please contact your administrator for more information.");
                if (filterRepositoryHelper != null)
                {

                    // Add the exception detail to the server event log.
                    filterRepositoryHelper.HandleException(ex);
                }
            }
        }

        // Displays the error string in the labelErrorMessage label.
        void displayError(string msg)
        {
            EnsureChildControls();
            
            labelErrorMessage.Text = msg;

            // Disable the OK button because the page is in an error state.
            buttonOK.Enabled = false;
            return;
        }

        // Verifies that the properties for the filter object are set.
        static void VerifyFilter(Filter filter)
        {

            if (null != filter)
            {

                // Verify that all required properties are set.
                if (string.IsNullOrEmpty(filter.SubTypeId)) 
                {

                    // This value must match the subType attribute specified
                    // in the web.config file.
                    filter.SubTypeId = "SampleFilter";
                }

                if (string.IsNullOrEmpty(filter.RendererClassName)) 
                {
                    filter.RendererClassName = typeof (MultiSelectTreeViewControl).AssemblyQualifiedName; 
                }

                // Define the BeginPoints property so the filter can send a parameter value to
                // scorecards and reports.
                // The value must be from the KeyColumn of the display
                // DataTable object, which is defined in the data provider. The data table is
                // returned by the FilterRepositoryHelper.GetParameterDisplayData method.
                // A filter has one beginpoint only, and it is represented by a
                // ParameterDefinition object. The ParameterDefinition object defines how
                // the filter accesses the data.
                if (0 == filter.BeginPoints.Count)
                {
                    ParameterDefinition paramDef = new ParameterDefinition
                                                       {
                                                           // This value must match the value returned 
                                                           // by the data provider's GetId method.
                                                           ParameterProviderId = "SampleFilterDataProvider",

                                                           // Reference the data provider.
                                                           DefaultPostFormula = string.Empty,

                                                           // Specify the column that contains
                                                           // the key identifiers and the column
                                                           // that contains the display values.
                                                           // The sample uses the same column
                                                           // for both purposes.
                                                           // These values must match the structure
                                                           // of the data table that is returned
                                                           // by the ParameterDefinition.DisplayValues property.
                                                           KeyColumn = "Symbol",
                                                           DisplayColumn = "Symbol",

                                                           // You can use this property to store
                                                           // extra information for this filter.
                                                           CustomDefinition = string.Empty
                                                       };
                    filter.BeginPoints.Add(paramDef);
                }

                // Set optional properties. The renderer can return multiple values. 
                filter.SelectionMode = FilterSelectionMode.MultiSelect;
            }
        }

        // Populates the dropdownlistDataSource control.
        void PopulateDataSourceDropDown(DataSource filterDataSource)
        {
            EnsureChildControls();
            
            FilterRepositoryHelper filterRepositoryHelper =
                (FilterRepositoryHelper)ViewState["filterrepositoryhelper"];

            // Retrieve data sources from the repository by using the DataSourceHelper
            // property to call the DataSourceConsumerHelper object.
            // If you modify the types of data source to retrieve, you must make the corresponding
            // change in the filter's data provider.
            // The parameter contains the default server-relative URL to the PerformancePoint Data Connections Library.
            // Edit this value if you are not using the default path. A leading forward slash may not be needed.
            ICollection dataSourceCollection = filterRepositoryHelper.DataSourceHelper.GetDataSourcesBySourceNames("/BICenter/Data%20Connections%20for%20PerformancePoint/",
                new[] { "WSTabularDataSource", DataSourceNames.ExcelWorkbook });
            if (null == dataSourceCollection)
            {
                displayError("No available data sources were found.");
                return;
            }

            // Create a list of name/value pairs for the dropdownlistDataSource control.
            var dataSources = new List<KeyValuePair<string, string>>();
            int selectedIndex = 0;
            int i = 1;
            dataSources.Add(new KeyValuePair<string, string>(string.Empty, string.Empty));

            foreach (DataSource ds in dataSourceCollection)
            {
                dataSources.Add(new KeyValuePair<string, string>(ds.Name.Text, ds.Location.ItemUrl));

                // Check if the entry is the originally selected data source.
                if ((filterDataSource != null) &&
                    (string.Compare(ds.Name.Text, filterDataSource.Name.Text) == 0))
                {
                    selectedIndex = i;
                }
                ++i;
            }

            dropdownlistDataSource.DataSource = dataSources;
            dropdownlistDataSource.DataTextField = "Key";
            dropdownlistDataSource.DataValueField = "Value";
            dropdownlistDataSource.DataBind();
            dropdownlistDataSource.SelectedIndex = selectedIndex;
        }


        // Populate the list box data.
        void PopulateListBoxData(DataSource datasource)
        {
            EnsureChildControls();
            
            ClearStocksListBox();
            
            FilterRepositoryHelper filterRepositoryHelper =
                (FilterRepositoryHelper)ViewState["filterrepositoryhelper"];

            // Retrieve the first 100 rows of the preview data from the data source
            DataSet dataSet = filterRepositoryHelper.DataSourceHelper.GetDataSet(100, datasource);

            if (null != dataSet && null != dataSet.Tables[0])
            {
                listboxStocks.DataTextField = "Symbol";
                listboxStocks.DataValueField = "Value";
                listboxStocks.DataSource = dataSet.Tables[0];
                listboxStocks.DataBind();
            }
        }
    }
}
'INSTANT VB NOTE: This code snippet uses implicit typing. You will need to set 'Option Infer On' in the VB file or set 'Option Infer' at the project level:

Imports System
Imports System.Collections
Imports System.Collections.Generic
Imports System.Data
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports Microsoft.PerformancePoint.Scorecards
Imports Microsoft.PerformancePoint.Scorecards.ServerCommon
Imports Microsoft.PerformancePoint.Scorecards.ServerRendering

Namespace Microsoft.PerformancePoint.SDK.Samples.SampleFilter

    ' Represents the class that defines the sample filter editor.
    Public Class SampleFilterEditor
        Inherits Page

        ' Declare private variables for the ASP.NET controls defined in the user interface.
        ' The sample's user interface is an ASPX page that defines the controls in HTML.
        Private textboxName As TextBox
        Private textboxDescription As TextBox
        Private labelErrorMessage As Label
        Private dropdownlistDataSource As DropDownList
        Private buttonOK As Button
        Private listboxStocks As ListBox

        ' Make the controls available to this class.
        Protected Overrides Sub CreateChildControls()
            MyBase.CreateChildControls()

            If Nothing Is textboxName Then
                textboxName = TryCast(FindControl("textboxName"), TextBox)
            End If
            If Nothing Is textboxDescription Then
                textboxDescription = TryCast(FindControl("textboxDescription"), TextBox)
            End If
            If Nothing Is dropdownlistDataSource Then
                dropdownlistDataSource = TryCast(FindControl("dropdownlistDataSource"), DropDownList)
            End If
            If Nothing Is labelErrorMessage Then
                labelErrorMessage = TryCast(FindControl("labelErrorMessage"), Label)
            End If
            If Nothing Is buttonOK Then
                buttonOK = TryCast(FindControl("buttonOK"), Button)
            End If
            If Nothing Is listboxStocks Then
                listboxStocks = TryCast(FindControl("listboxStocks"), ListBox)
            End If
        End Sub

        ' Handles the Load event of the Page control.
        ' Methods that use a control variable should call the Control.EnsureChildControls
        ' method before accessing the variable for the first time.
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)

            ' Required to enable custom report and filter editors to
            ' write data to the repository.
            ServerUtils.AllowUnsafeUpdates = True

            ' Initialize controls the first time the page loads only.
            If Not IsPostBack Then
                EnsureChildControls()
                Dim filterRepositoryHelper As FilterRepositoryHelper = Nothing
                Try

                    ' Get information from the query string parameters.
                    Dim server As String = Request.QueryString(ClickOnceLaunchKeys.SiteCollectionUrl)
                    Dim itemLocation As String = Request.QueryString(ClickOnceLaunchKeys.ItemLocation)
                    Dim action As String = Request.QueryString(ClickOnceLaunchKeys.LaunchOperation)

                    ' Validate the query string parameters.
                    If String.IsNullOrEmpty(server) OrElse String.IsNullOrEmpty(itemLocation) OrElse String.IsNullOrEmpty(action) Then
                        displayError("Invalid URL.")
                        Return
                    End If

                    ' Retrieve the repository-helper object.
                    filterRepositoryHelper = New FilterRepositoryHelper()

                    ' Set the filter location.
                    Dim repositoryFilterLocation As RepositoryLocation = RepositoryLocation.CreateFromUriString(itemLocation)

                    Dim filter As Filter
                    Dim datasource As DataSource = Nothing

                    ' Retrieve or create the filter object, depending on the operation
                    ' passed in the query string (OpenItem or CreateItem).
                    If ClickOnceLaunchValues.OpenItem.Equals(action, StringComparison.OrdinalIgnoreCase) Then

                        ' Retrieve the filter object by using the repository-helper object.
                        filter = filterRepositoryHelper.Get(repositoryFilterLocation)
                        If filter Is Nothing Then
                            displayError("Could not retrieve the filter for editing.")
                            Return
                        End If

                    ElseIf ClickOnceLaunchValues.CreateItem.Equals(action, StringComparison.OrdinalIgnoreCase) Then

                        ' Create a filter.
                        ' CreateItem requests can be sent from a SharePoint list, but
                        ' you must create a custom menu item to send the request.
                        ' Dashboard Designer can send edit requests only.
                        filter = New Filter With {.RendererClassName = GetType(MultiSelectTreeViewControl).AssemblyQualifiedName, .SubTypeId = "SampleFilter"}
                        ' Specify the class that defines the renderer
                        ' Web server control. The sample filter uses a native
                        ' PerformancePoint Services renderer.
                        ' Defaults to the value specified in the web.config file
                        ' Specify the unique identifier for the filter.
                        ' The SubTypeId property must match the
                        ' subType attribute in the web.config file.
                    Else
                        displayError("Invalid Action.")
                        Return
                    End If

                    VerifyFilter(filter)

                    ' Retrieve filter's underlying data source.
                    If Not String.IsNullOrEmpty(filter.DataSourceLocation.ItemUrl) Then
                        Dim repositoryDatasourceLocation As RepositoryLocation = RepositoryLocation.CreateFromUriString(filter.DataSourceLocation.ItemUrl)
                        ' Gets a PerformancePoint Services data source by using the
                        ' DataSourceHelper property to call the
                        ' DataSourceConsumerHelper.GetDataSource method. 
                        datasource = filterRepositoryHelper.DataSourceHelper.GetDataSource(repositoryDatasourceLocation)
                    End If

                    ' Save the original filter and helper objects across page postbacks.
                    ViewState("action") = action
                    ViewState("filter") = filter
                    ViewState("filterrepositoryhelper") = filterRepositoryHelper
                    ViewState("itemlocation") = itemLocation

                    ' Populate the child controls.
                    textboxName.Text = filter.Name.ToString()
                    textboxDescription.Text = filter.Description.ToString()

                    ' Populate the dropdownlistDataSource control with data sources of specific
                    ' types from the PerformancePoint Services repository.
                    ' This method looks up the passed data source in the data sources
                    ' that are registered in the web.config file. 
                    ' Although the sample retrieves data sources of two specific types,
                    ' you can modify it to prompt the user for a data source type.
                    PopulateDataSourceDropDown(datasource)

                    ' Call the SelectedIndexChanged event directly to populate the 
                    ' listbox control with preview data.
                    dropdownlistDataSource_SelectedIndexChanged(Nothing, Nothing)
                Catch ex As Exception
                    displayError("An error has occurred. Please contact your administrator for more information.")
                    If filterRepositoryHelper IsNot Nothing Then
                        ' Add the exception detail to the server event log.
                        filterRepositoryHelper.HandleException(ex)
                    End If
                End Try
            End If
        End Sub

        ' Handles the SelectedIndexChanged event of the dropdownlistDataSource control.
        Protected Sub dropdownlistDataSource_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
            EnsureChildControls()

            ' Check if a valid data source is selected.
            If Nothing IsNot dropdownlistDataSource.SelectedItem AndAlso (Not String.IsNullOrEmpty(dropdownlistDataSource.SelectedItem.Text)) Then
                ' Retrieve the data source object.
                Dim filterRepositoryHelper As FilterRepositoryHelper = CType(ViewState("filterrepositoryhelper"), FilterRepositoryHelper)
                Dim selectedDataSourceItemUrl As String = dropdownlistDataSource.SelectedItem.Value

                Dim repositoryDatasourceLocation As RepositoryLocation = RepositoryLocation.CreateFromUriString(selectedDataSourceItemUrl)
                Dim datasource As DataSource = filterRepositoryHelper.DataSourceHelper.GetDataSource(repositoryDatasourceLocation)
                ViewState("datasource") = datasource

                ' Populate the listboxStocks control with the preview data for the selected
                ' data source.
                PopulateListBoxData(datasource)
            Else
                ClearStocksListBox()
            End If
        End Sub

        ' Clears the listboxStocks control.
        ' The sample filter works with a Web service that provides stock information.
        Private Sub ClearStocksListBox()
            listboxStocks.DataSource = Nothing
            listboxStocks.DataBind()
            listboxStocks.Items.Clear()
        End Sub

        ' Handles the Click event of the buttonOK control.
        Protected Sub buttonOK_Click(ByVal sender As Object, ByVal e As EventArgs)
            EnsureChildControls()

            ' Verify that the controls contain values.
            If String.IsNullOrEmpty(textboxName.Text) Then
                labelErrorMessage.Text = "A filter name is required."
                Return
            End If
            If dropdownlistDataSource.SelectedIndex = 0 Then
                labelErrorMessage.Text = "A data source is required."
                Return
            End If

            ' Clear any pre-existing error message.
            labelErrorMessage.Text = String.Empty

            ' Retrieve the filter, data source, and helper objects from view state.
            Dim action As String = CStr(ViewState("action"))
            Dim itemLocation As String = CStr(ViewState("itemlocation"))
            Dim filter As Filter = CType(ViewState("filter"), Filter)
            Dim datasource As DataSource = CType(ViewState("datasource"), DataSource)
            Dim filterRepositoryHelper As FilterRepositoryHelper = CType(ViewState("filterrepositoryhelper"), FilterRepositoryHelper)

            ' Update the filter object with form changes.
            filter.Name.Text = textboxName.Text
            filter.Description.Text = textboxDescription.Text
            filter.DataSourceLocation = datasource.Location
            For Each parameterDefinition As ParameterDefinition In filter.BeginPoints
                parameterDefinition.DisplayName = filter.Name.Text
            Next parameterDefinition

            ' Initialize the filter. This method runs the filter's query and retrieves preview data.
            filterRepositoryHelper.GetParameterDisplayData(filter)

            ' Save the filter object to the PerformancePoint Services repository.
            Try
                filter.Validate()

                If ClickOnceLaunchValues.CreateItem.Equals(action, StringComparison.OrdinalIgnoreCase) Then
                    Dim newFilter As Filter = filterRepositoryHelper.Create(If(String.IsNullOrEmpty(filter.Location.ItemUrl), itemLocation, filter.Location.ItemUrl), filter)
                    ViewState("filter") = newFilter
                    ViewState("action") = ClickOnceLaunchValues.OpenItem
                Else
                    filterRepositoryHelper.Update(filter)
                End If
            Catch ex As Exception
                displayError("An error has occurred. Please contact your administrator for more information.")
                If filterRepositoryHelper IsNot Nothing Then

                    ' Add the exception detail to the server event log.
                    filterRepositoryHelper.HandleException(ex)
                End If
            End Try
        End Sub

        ' Displays the error string in the labelErrorMessage label.
        Private Sub displayError(ByVal msg As String)
            EnsureChildControls()

            labelErrorMessage.Text = msg

            ' Disable the OK button because the page is in an error state.
            buttonOK.Enabled = False
            Return
        End Sub

        ' Verifies that the properties for the filter object are set.
        Private Shared Sub VerifyFilter(ByVal filter As Filter)

            If Nothing IsNot filter Then

                ' Verify that all required properties are set.
                If String.IsNullOrEmpty(filter.SubTypeId) Then

                    ' This value must match the subType attribute specified
                    ' in the web.config file.
                    filter.SubTypeId = "SampleFilter"
                End If

                If String.IsNullOrEmpty(filter.RendererClassName) Then
                    filter.RendererClassName = GetType(MultiSelectTreeViewControl).AssemblyQualifiedName
                End If

                ' Define the BeginPoints property so the filter can send a parameter value to
                ' scorecards and reports.
                ' The value must be from the KeyColumn of the display
                ' DataTable object, which is defined in the data provider. The data table is
                ' returned by the FilterRepositoryHelper.GetParameterDisplayData method.
                ' A filter has one beginpoint only, and it is represented by a
                ' ParameterDefinition object. The ParameterDefinition object defines how
                ' the filter accesses the data.
                If 0 = filter.BeginPoints.Count Then
                    Dim paramDef As ParameterDefinition = New ParameterDefinition With {.ParameterProviderId = "SampleFilterDataProvider", .DefaultPostFormula = String.Empty, .KeyColumn = "Symbol", .DisplayColumn = "Symbol", .CustomDefinition = String.Empty}
                    ' This value must match the value returned 
                    ' by the data provider's GetId method.
                    ' Reference the data provider.
                    ' Specify the column that contains
                    ' the key identifiers and the column
                    ' that contains the display values.
                    ' The sample uses the same column
                    ' for both purposes.
                    ' These values must match the structure
                    ' of the data table that is returned
                    ' by the ParameterDefinition.DisplayValues property.
                    ' You can use this property to store
                    ' extra information for this filter.
                    filter.BeginPoints.Add(paramDef)
                End If

                ' Set optional properties. The renderer can return multiple values. 
                filter.SelectionMode = FilterSelectionMode.MultiSelect
            End If
        End Sub

        ' Populates the dropdownlistDataSource control.
        Private Sub PopulateDataSourceDropDown(ByVal filterDataSource As DataSource)
            EnsureChildControls()

            Dim filterRepositoryHelper As FilterRepositoryHelper = CType(ViewState("filterrepositoryhelper"), FilterRepositoryHelper)

            ' Retrieve data sources from the repository by using the DataSourceHelper
            ' property to call the DataSourceConsumerHelper object.
            ' If you modify the types of data source to retrieve, you must make the corresponding
            ' change in the filter's data provider.
            ' The parameter contains the default server-relative URL to the PerformancePoint Data Connections Library.
            ' Edit this value if you are not using the default path. A leading forward slash may not be needed.
            Dim dataSourceCollection As ICollection = filterRepositoryHelper.DataSourceHelper.GetDataSourcesBySourceNames("/BICenter/Data%20Connections%20for%20PerformancePoint/", {"WSTabularDataSource", DataSourceNames.ExcelWorkbook})
            If Nothing Is dataSourceCollection Then
                displayError("No available data sources were found.")
                Return
            End If

            ' Create a list of name/value pairs for the dropdownlistDataSource control.
            Dim dataSources = New List(Of KeyValuePair(Of String, String))()
            Dim selectedIndex As Integer = 0
            Dim i As Integer = 1
            dataSources.Add(New KeyValuePair(Of String, String)(String.Empty, String.Empty))

            For Each ds As DataSource In dataSourceCollection
                dataSources.Add(New KeyValuePair(Of String, String)(ds.Name.Text, ds.Location.ItemUrl))

                ' Check if the entry is the originally selected data source.
                If (filterDataSource IsNot Nothing) AndAlso (String.Compare(ds.Name.Text, filterDataSource.Name.Text) = 0) Then
                    selectedIndex = i
                End If
                i += 1
            Next ds

            dropdownlistDataSource.DataSource = dataSources
            dropdownlistDataSource.DataTextField = "Key"
            dropdownlistDataSource.DataValueField = "Value"
            dropdownlistDataSource.DataBind()
            dropdownlistDataSource.SelectedIndex = selectedIndex
        End Sub


        ' Populate the list box data.
        Private Sub PopulateListBoxData(ByVal datasource As DataSource)
            EnsureChildControls()

            ClearStocksListBox()

            Dim filterRepositoryHelper As FilterRepositoryHelper = CType(ViewState("filterrepositoryhelper"), FilterRepositoryHelper)

            ' Retrieve the first 100 rows of the preview data from the data source
            Dim dataSet As DataSet = filterRepositoryHelper.DataSourceHelper.GetDataSet(100, datasource)

            If Nothing IsNot dataSet AndAlso Nothing IsNot dataSet.Tables(0) Then
                listboxStocks.DataTextField = "Symbol"
                listboxStocks.DataValueField = "Value"
                listboxStocks.DataSource = dataSet.Tables(0)
                listboxStocks.DataBind()
            End If
        End Sub
    End Class
End Namespace

Compilation du code

Pour pouvoir compiler cet exemple de code, vous devez configurer votre environnement de développement comme décrit dans Pour créer et configurer la classe d’éditeur.

Sécurité

Vous devez signer votre DLL avec un nom fort. De plus, assurez-vous que tous les assemblys référencés par votre DLL ont des noms forts. Pour plus d’informations sur la façon de signer un assembly avec un nom fort et sur la façon de créer une paire de clés publique/privée, voir How to: Create a Public/Private Key Pair.

Voir aussi

Tâches

Procédure : Créer des fournisseurs de données pour les filtres des services PerformancePoint Services

Concepts

Éditeurs pour les objets personnalisés des services PerformancePoint Services

Filtres de PerformancePoint Services

Autres ressources

Créer des objets personnalisés pour les services PerformancePoint Services

Exemples de code pour les pour les services PerformancePoint Services dans SharePoint Server 2010