Développement d'une interface utilisateur pour un composant de flux de données
Les développeurs de composants peuvent fournir une interface utilisateur personnalisée pour un composant. Cette interface s'affiche dans Business Intelligence Development Studio lors de la modification du composant. Grâce à l'implémentation d'une interface utilisateur personnalisée, vous êtes averti lorsque le composant est ajouté ou supprimé d'une tâche de flux de données, et lorsque de l'aide est demandée pour le composant.
Si vous ne fournissez pas d'interface utilisateur personnalisée pour votre composant, les utilisateurs peuvent encore configurer le composant et ses propriétés personnalisées à l'aide de l'éditeur avancé. Vous pouvez vous assurer que l'éditeur avancé permet aux utilisateurs de modifier convenablement des valeurs de propriété personnalisées à l'aide des propriétés TypeConverter et UITypeEditor de IDTSCustomProperty100 le cas échéant. Pour plus d'informations, consultez « Création de propriétés personnalisées » dans Méthodes de conception d'un composant de flux de données.
Définition de la propriété UITypeName
Pour fournir une interface utilisateur personnalisée, le développeur doit attribuer à la propriété UITypeName de DtsPipelineComponentAttribute le nom d'une classe qui implémente l'interface IDtsComponentUI. Lorsque cette propriété est définie par le composant, SQL ServerIntegration Services charge et appelle l'interface utilisateur personnalisée lorsque le composant est modifié dans le concepteur SSIS.
La propriété UITypeName est une chaîne délimitée par des virgules qui identifie le nom qualifié complet du type. La liste suivante affiche, dans l'ordre, les éléments qui identifient le type :
Nom de type
Nom de l'assembly
Version de fichier
Culture
Jeton de clé publique
L'exemple de code suivant montre une classe dérivée de la classe de base PipelineComponent et spécifie la propriété UITypeName.
[DtsPipelineComponent(
DisplayName="SampleComponent",
UITypeName="MyNamespace.MyComponentUIClassName,MyAssemblyName,Version=1.0.0.0,Culture=neutral,PublicKeyToken=abcd...",
ComponentType = ComponentType.Transform)]
public class SampleComponent : PipelineComponent
{
//TODO: Implement the component here.
}
<DtsPipelineComponent(DisplayName="SampleComponent", _
UITypeName="MyNamespace.MyComponentUIClassName,MyAssemblyName,Version=1.0.0.0,Culture=neutral,PublicKeyToken=abcd...", ComponentType=ComponentType.Transform)> _
Public Class SampleComponent
Inherits PipelineComponent
End Class
Implémentation de l'interface IDtsComponentUI
L'interface IDtsComponentUI contient des méthodes que le concepteur SSIS appelle lorsqu'un composant est ajouté, supprimé ou modifié. Les développeurs de composants peuvent fournir du code dans leur implémentation de ces méthodes pour interagir avec les utilisateurs des composants.
Cette classe est généralement implémentée dans un assembly distinct du composant lui-même. Bien qu'elle ne soit pas obligatoire, l'utilisation d'un assembly séparé permet au développeur de générer et déployer le composant et l'interface utilisateur indépendamment l'un de l'autre et de limiter l'encombrement binaire du composant.
L'implémentation d'une interface utilisateur personnalisée permet au développeur de composants de mieux contrôler le composant lorsqu'il est modifié dans le concepteur SSIS. Par exemple, un composant peut ajouter du code à la méthode New, appelée lorsqu'un composant est initialement ajouté à une tâche de flux de données, et afficher un Assistant qui guide l'utilisateur à travers la configuration initiale du composant.
Après avoir créé une classe qui implémente l'interface IDtsComponentUI, vous devez ajouter du code pour répondre à l'interaction de l'utilisateur avec le composant. La méthode Initialize fournit l'interface IDTSComponentMetaData100 du composant et est appelée avant les méthodes New et Edit. Cette référence doit être stockée dans une variable membre privée et utilisée ensuite pour modifier les métadonnées du composant.
Modification d'un composant et persistance des modifications
L'interface IDTSComponentMetaData100 est fournie en tant que paramètre à la méthode Initialize. Cette référence doit être mise en cache dans une variable membre par le code d'interface utilisateur, puis utilisée pour modifier le composant en réponse à l'interaction de l'utilisateur avec l'interface utilisateur.
Bien que vous puissiez modifier le composant directement à partir de l'interface IDTSComponentMetaData100, il est préférable de créer une instance de CManagedComponentWrapper à l'aide de la méthode Instantiate. Lorsque vous modifiez directement le composant à l'aide de l'interface, vous contournez les dispositifs de protection de la validation du composant. L'utilisation de l'instance du composant au moment de la conception par le biais de CManagedComponentWrapper présente l'avantage de garantir que le composant peut contrôler les modifications qui lui sont appliquées.
La valeur de retour de la méthode Edit détermine si les modifications apportées à un composant sont conservées ou supprimées. Lorsque cette méthode retourne false, toutes les modifications sont ignorées ; true rend persistantes les modifications apportées au composant et marque le package comme devant être enregistré.
Utilisation des services du concepteur SSIS
Le paramètre IServiceProvider de la méthode Initialize fournit l'accès aux services suivants du concepteur SSIS :
Service |
Description |
---|---|
Permet de déterminer si le composant a été généré dans le cadre d'une opération copier/coller ou couper/coller. |
|
Permet d'accéder aux connexions existantes ou de créer des connexions dans le package. |
|
Permet de capturer des événements à partir de composants de flux de données lorsque vous devez capturer l'ensemble des erreurs et avertissements déclenchés par le composant au lieu de ne recevoir que la dernière erreur ou le dernier avertissement. |
|
Permet d'accéder aux variables existantes ou de créer des variables dans le package. |
|
Permet aux composants de flux de données d'accéder à la tâche de flux de données parente et aux autres composants dans le flux de données. Cette fonctionnalité pourrait être utilisée pour développer un composant semblable à l'Assistant Dimension à variation lente qui crée et connecte des composants de flux de données supplémentaires si nécessaire. |
Ces services fournissent aux développeurs de composants la capacité d'accéder à des objets (ou d'en créer) dans le package dans lequel le composant est chargé.
Exemple
L'exemple de code suivant montre l'intégration d'une classe d'interface utilisateur personnalisée qui implémente l'interface IDtsComponentUI, et un Windows Form qui fait office d'éditeur pour un composant.
Classe d'interface utilisateur personnalisée
Le code suivant montre la classe qui implémente l'interface IDtsComponentUI. La méthode Edit crée l'éditeur de composant, puis affiche le formulaire. La valeur de retour du formulaire détermine si les modifications apportées au composant sont rendues persistantes.
using System;
using System.Windows.Forms;
using Microsoft.SqlServer.Dts.Runtime;
using Microsoft.SqlServer.Dts.Pipeline.Design;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
namespace Microsoft.Samples.SqlServer.Dts
{
public class SampleComponentUI : IDtsComponentUI
{
IDTSComponentMetaData100 md;
IServiceProvider sp;
public void Help(System.Windows.Forms.IWin32Window parentWindow)
{
}
public void New(System.Windows.Forms.IWin32Window parentWindow)
{
}
public void Delete(System.Windows.Forms.IWin32Window parentWindow)
{
}
public bool Edit(System.Windows.Forms.IWin32Window parentWindow, Variables vars, Connections cons)
{
// Create and display the form for the user interface.
SampleComponentUIForm componentEditor = new SampleComponentUIForm(cons, vars, md);
DialogResult result = componentEditor.ShowDialog(parentWindow);
if (result == DialogResult.OK)
return true;
return false;
}
public void Initialize(IDTSComponentMetaData100 dtsComponentMetadata, IServiceProvider serviceProvider)
{
// Store the component metadata.
this.md = dtsComponentMetadata;
}
}
}
Imports System
Imports System.Windows.Forms
Imports Microsoft.SqlServer.Dts.Runtime
Imports Microsoft.SqlServer.Dts.Pipeline.Design
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Namespace Microsoft.Samples.SqlServer.Dts
Public Class SampleComponentUI
Implements IDtsComponentUI
Private md As IDTSComponentMetaData100
Private sp As IServiceProvider
Public Sub Help(ByVal parentWindow As System.Windows.Forms.IWin32Window)
End Sub
Public Sub New(ByVal parentWindow As System.Windows.Forms.IWin32Window)
End Sub
Public Sub Delete(ByVal parentWindow As System.Windows.Forms.IWin32Window)
End Sub
Public Function Edit(ByVal parentWindow As System.Windows.Forms.IWin32Window, ByVal vars As Variables, ByVal cons As Connections) As Boolean
' Create and display the form for the user interface.
Dim componentEditor As SampleComponentUIForm = New SampleComponentUIForm(cons, vars, md)
Dim result As DialogResult = componentEditor.ShowDialog(parentWindow)
If result = DialogResult.OK Then
Return True
End If
Return False
End Function
Public Sub Initialize(ByVal dtsComponentMetadata As IDTSComponentMetaData100, ByVal serviceProvider As IServiceProvider)
Me.md = dtsComponentMetadata
End Sub
End Class
End Namespace
Éditeur personnalisé
Le code suivant montre l'implémentation du Windows Form affiché lors de l'appel à la méthode Edit.
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime;
namespace Microsoft.Samples.SqlServer.Dts
{
public partial class SampleComponentUIForm : System.Windows.Forms.Form
{
private Connections connections;
private Variables variables;
private IDTSComponentMetaData100 metaData;
private CManagedComponentWrapper designTimeInstance;
private System.ComponentModel.IContainer components = null;
public SampleComponentUIForm( Connections cons, Variables vars, IDTSComponentMetaData100 md)
{
variables = vars;
connections = cons;
metaData = md;
}
private void btnOk_Click(object sender, System.EventArgs e)
{
if (designTimeInstance == null)
designTimeInstance = metaData.Instantiate();
designTimeInstance.SetComponentProperty( "CustomProperty", txtCustomPropertyValue.Text);
this.Close();
}
private void btnCancel_Click(object sender, System.EventArgs e)
{
this.Close();
}
}
}
Imports System
Imports System.Drawing
Imports System.Collections
Imports System.ComponentModel
Imports System.Windows.Forms
Imports System.Data
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime
Namespace Microsoft.Samples.SqlServer.Dts
Public Partial Class SampleComponentUIForm
Inherits System.Windows.Forms.Form
Private connections As Connections
Private variables As Variables
Private metaData As IDTSComponentMetaData100
Private designTimeInstance As CManagedComponentWrapper
Private components As System.ComponentModel.IContainer = Nothing
Public Sub New(ByVal cons As Connections, ByVal vars As Variables, ByVal md As IDTSComponentMetaData100)
variables = vars
connections = cons
metaData = md
End Sub
Private Sub btnOk_Click(ByVal sender As Object, ByVal e As System.EventArgs)
If designTimeInstance Is Nothing Then
designTimeInstance = metaData.Instantiate
End If
designTimeInstance.SetComponentProperty("CustomProperty", txtCustomPropertyValue.Text)
Me.Close
End Sub
Private Sub btnCancel_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Me.Close
End Sub
End Class
End Namespace
|