Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Découvrez comment créer le composant Éditeur d’une extension de filtre personnalisée pour PerformancePoint Services.
Quelles sont les éditeurs de filtres personnalisés pour PerformancePoint Services ?
In PerformancePoint Services, custom filter editors enable users to set properties on custom filters. Les éditeurs de filtre 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ètre pour les consommateurs de carte de performance et de rapport. For more information about editor requirements and functionality, see Éditeurs pour les objets personnalisés des services PerformancePoint Services.
Les procédures et les exemples suivants sont basés sur la classe SampleFilterEditor à partir de l' exemple d'objets personnalisés. L'éditeur est une application web léger qui permet aux utilisateurs de modifier le nom et la description du filtre et à sélectionner la source de données sous-jacente. Pour obtenir le code complet de la classe, voir Exemple de code : Créer, récupérer et mettre à jour des filtres PerformancePoint Services personnalisés dans SharePoint.
Nous vous recommandons d'utiliser l'éditeur de l'exemple en tant que modèle. Le montre l'exemple comment faire pour appeler des objets l'API, PerformancePoint Services fournit les objets d'assistance qui simplifient des appels pour les opérations du référentiel (tels que la création et la mise à jour des objets) et présente les méthodes conseillées pour le développement de PerformancePoint Services.
Créer et configurer la classe d'éditeur pour les filtres personnalisés PerformancePoint Services
Install PerformancePoint Services, or copy the DLLs that your extension uses (see step 3) to your computer. Pour plus d’informations, consultez DLL avec bibliothèques de classes.
Dans Visual Studio, créez une bibliothèque de classes c#. Si vous avez créé une bibliothèque de classes de votre extension, ajoutez une nouvelle classe c#.
Vous devez signer votre DLL en utilisant un nom fort. Par ailleurs, assurez-vous que tous les assemblys référencés par votre DLL ont des noms forts. Pour plus d’informations sur la signature d’un assembly avec un nom fort et sur la création d’une paire de clés publique/privée, consultez Guide pratique pour créer une paire de clés publique/privée.
Ajoutez les DLL 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ée par les classes d'assistance)
- Microsoft.SharePoint.dll (utilisée par les classes d'assistance)
L'éditeur de l'exemple contient également des références d'assembly aux DLL System.Web.dll et System.Web.Services.dll. Selon le fonctionnement de votre extension, d'autres références de projet peuvent être requises.
Ajoutez les classes suivantes à partir de l'échantillon au projet. L'éditeur utilise ces classes d'assistance pour interagir avec le référentiel de PerformancePoint Services:
- DataSourceConsumerHelper.cs
- ExtensionRepositoryHelper.cs
- FilterRepositoryHelper.cs
- IDataSourceConsumer.cs
Dans votre classe d’éditeur, ajoutez
usingdes directives pour les espaces de noms PerformancePoint Services suivants :- Microsoft.PerformancePoint.Scorecards
- Microsoft.PerformancePoint.Scorecards.ServerCommon
- Microsoft.PerformancePoint.Scorecards.ServerRendering
Selon le fonctionnement de votre extension, d'autres directives using peuvent être requises.
Héritez de la classe de base qui prend en charge votre implémentation d'éditeur. Étant donné que l’exemple d’éditeur de filtre est 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 .
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, l’éditeur appelle la méthode CreateChildControls() pour rendre les contrôles disponibles sur la page.
Remarque
L’éditeur définit la logique de programmation séparément de l’interface utilisateur. La méthode de création du composant d'interface utilisateur de l'éditeur dépasse le cadre de cette documentation.
L'éditeur de filtre exemple effectue les étapes 8 à 12 dans la méthode Page_Load. Page_Load est également utilisé pour 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.
Définissez la propriété AllowUnsafeUpdates sur true. Cela permet à l'éditeur de filtre d'écrire des données dans le référentiel sans utiliser d'opérations POST de formulaire.
Récupérez les paramètres de la chaîne de requête et définissez-les comme valeurs pour les variables locales, comme dans l'exemple de code ci-dessous.
// 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];Remarque
Pour plus d’informations sur les paramètres de chaîne de requête, consultez Éditeurs d’objets PerformancePoint Services personnalisés.
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();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);Extrayez l'opération à effectuer ( OpenItem ou CreateItem) de la chaîne de requête, puis récupérer ou créer le filtre personnalisé.
- 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 pour le filtre, et elle 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 de serveur web convertisseur. Si elle n'est pas définie dans l'éditeur, la valeur par défaut pour la classe de convertisseur qui est spécifiée dans le fichier web.config.
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" }; }Remarque
[!REMARQUE] By default, users can create custom objects from PerformancePoint Dashboard Designer only. 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 requête CreateItem à votre éditeur à partir du type de contenu dans le référentiel. For more information, see Éditeurs pour les objets personnalisés des services PerformancePoint Services.
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); }Pour permettre aux utilisateurs de sélectionner une source de données pour le filtre, remplir le contrôle de sélection avec des sources de données PerformancePoint Services. La méthode PopulateDataSourceDropDown dans l'éditeur de filtre exemple appelle la méthode DataSourceConsumerHelper.GetDataSourcesBySourceNames pour récupérer 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 });L'éditeur de filtre exemple extrait uniquement deux types de source de données, mais vous pouvez modifier cette méthode pour prendre en charge d'autres types de sources de données ou pour inviter l'utilisateur pour le type de source de données à récupérer. Pour référencer une source de données native d’un type particulier, utilisez la propriété SourceName , qui retourne un champ 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 est la même valeur que l'attribut subType qui est enregistrée dans le fichier web.config 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.
Définissez le point de début 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.
Créez un objet ParameterDefinition . BeginPoints renvoie un objet ParameterDefinitionCollection qui contient un seul objet ParameterDefinition .
Pour spécifier le fournisseur de données du filtre, définissez la propriété ParameterProviderId sur 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.
Pour spécifier la source des identificateurs de clé pour les valeurs de filtre, définissez la propriété KeyColumn sur la colonne dans la table de données d’affichage qui contient les identificateurs de clé. L'exemple d'éditeur de filtre affecte comme valeur de cette propriété la colonne « Symbol ».
Pour spécifier la source des valeurs d’affichage pour le contrôle de filtre, définissez la propriété DisplayColumn sur la colonne dans 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 ».
Remarque
La table de données d’affichage est retourné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); }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.
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.
Remarque
[!REMARQUE] L'éditeur doit appeler FilterRepositoryHelper.GetParameterDisplayData au moins une fois avant de mettre à jour l'objet filtre.
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.
Remarque
Les utilisateurs peuvent définir les propriétés Nom, Description et Propriétaire (Personne responsable) d’un objet personnalisé et supprimer des objets personnalisés directement à partir du concepteur de tableau de bord et du référentiel PerformancePoint Services.
Exemple de code : Créer, récupérer et mettre à jour des filtres PerformancePoint Services personnalisés dans SharePoint
L'exemple de code suivant crée, extrait et met à jour des filtres personnalisés. Ce code provient de la classe code-behind de l'éditeur, qui fournit la logique de programmation pour les contrôles qui sont définis dans une page ASPX.
Avant de pouvoir compiler cet exemple de code, vous devez configurer votre environnement de développement comme décrit dans Créer et configurer la classe d’éditeur pour un éditeur de filtre dans PerformancePoint Services.
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();
}
}
}
}
Étapes suivantes
Après avoir créé un éditeur de filtre (y compris son interface utilisateur, si nécessaire) et un fournisseur de données, déployez l’extension comme décrit dans Guide pratique pour inscrire manuellement PerformancePoint Services extensions.