Implementieren eines datengebundenen Steuerelement-Designers für Web Forms
Die Hauptaufgabe eines datengebundenen Steuerelement-Designers besteht darin, einem Steuerelement den Zugriff auf eine andere (Muster-) Entwurfszeitdatenquelle zu ermöglichen, wenn sich das Steuerelement im Designer befindet. .NET Framework stellt eine Schnittstelle bereit (IDataSourceProvider), die den Vertrag angibt, der den Zugriff auf eine Datenquelle ermöglicht. Ein Designer für ein datengebundenes Serversteuerelement muss die IDataSourceProvider-Schnittstelle implementieren und die unten dargestellten Schritte ausführen.
So implementieren Sie einen datengebundenen Steuerelement-Designer
Hinweis Anhand der folgenden Schritte wird die Implementierung im Beispiel für einen datengebundenen Steuerelement-Designer mit Vorlagen in Web Forms ausgeführt. Diese Implementierung kann für ein Steuerelement mit einer Datenquelle vom Typ Object angewendet werden, das einen IEumerable-Verweis akzeptiert.
Definieren Sie eine Klasse, die direkt oder indirekt von ControlDesigner abgeleitet wird und die IDataSourceProvider-Schnittstelle implementiert (siehe folgendes Codefragment).
Public Class DataboundControlDesigner Inherits ControlDesigner Implements IDataSourceProvider ... End Class [C#] public class DataboundControlDesigner : ControlDesigner, IDataSourceProvider {...}
Legen Sie eine Eigenschaft (vom Typ String) mit der Bezeichnung DataSource offen, die eine Entwurfszeitdatenquelle angibt. Unter Beispiel für einen datengebundenen Steuerelement-Designer mit Vorlagen in Web Forms finden Sie ein Beispiel für die Implementierung dieser Eigenschaft. Die DataSource-Eigenschaft des Designers funktioniert zusätzlich zur DataBindings-Auflistung des Steuerelements.
Setzen Sie die GetDesignTimeHtml-Methode außer Kraft, und legen Sie für die Datenquelle des Steuerelements (das dem Designer zugeordnet ist) die Entwurfszeitdatenquelle fest. Unter Beispiel für einen datengebundenen Steuerelement-Designer mit Vorlagen in Web Forms finden Sie ein Beispiel dafür, wie diese Methode zum Ersetzen der Datenquelle außer Kraft gesetzt wird.
Setzen Sie die PreFilterProperties-Methode außer Kraft, um die DataSource-Eigenschaft des Steuerelements mit der Entwurfszeiteigenschaft DataSource zu ersetzen (zu spiegeln). Die PreFilterProperties-Methode gehört zur IDesignerFilter-Schnittstelle, die einem Designer das Ersetzen und Erstellen von Eigenschaften sowie von Ereignissen zur Entwurfszeit ermöglicht. IDesignerFilter wird von ControlDesigner implementiert. Weitere Informationen zum Filtern von Eigenschaften finden Sie unter Filtern von Metadaten. Anhand des folgenden Codefragments wird dargestellt, wie Sie die PreFilterProperties-Methode außer Kraft setzen können.
Protected Overrides Sub PreFilterProperties(properties As IDictionary) MyBase.PreFilterProperties(properties) Dim prop As PropertyDescriptor prop = CType(properties("DataSource"), PropertyDescriptor) Debug.Assert(( Not (prop Is Nothing))) prop = TypeDescriptor.CreateProperty(Me.GetType(), prop, _ New Attribute() {New TypeConverterAttribute(GetType(DataSourceConverter))}) properties("DataSource") = prop End Sub [C#] protected override void PreFilterProperties(IDictionary properties) { base.PreFilterProperties(properties); PropertyDescriptor prop; prop = (PropertyDescriptor)properties["DataSource"]; Debug.Assert(prop != null); prop = TypeDescriptor.CreateProperty(this.GetType(), prop, new Attribute[] { new TypeConverterAttribute(typeof(DataSourceConverter)) }); properties["DataSource"] = prop; }
Implementieren Sie die Methoden der IDataSourceProvider-Schnittstelle. Diese Schnittstelle verfügt über zwei Methoden: GetResolvedSelectedDataSource und GetSelectedDataSource. Anhand des folgenden Codebeispiels wird die Implementierung dieser Methoden im Beispiel für einen datengebundenen Steuerelement-Designer mit Vorlagen in Web Forms dargestellt.
Function GetResolvedSelectedDataSource() As IEnumerable Implements IDataSourceProvider.GetResolvedSelectedDataSource Return CType(CType(Me, IDataSourceProvider).GetSelectedDataSource(), IEnumerable) End Function Function GetSelectedDataSource() As Object Implements IDataSourceProvider.GetSelectedDataSource Dim selectedDataSource As Object = Nothing Dim dataSource As String = Nothing Dim binding As DataBinding = DataBindings("DataSource") If Not (binding Is Nothing) Then dataSource = binding.Expression End If If Not (dataSource Is Nothing) Then Dim componentSite As ISite = Component.Site If Not (componentSite Is Nothing) Then Dim container As IContainer = CType(componentSite.GetService(GetType(IContainer)), IContainer) If Not (container Is Nothing) Then Dim comp As IComponent = container.Components(dataSource) If TypeOf comp Is IEnumerable Then selectedDataSource = comp End If End If End If End If Return selectedDataSource End Function [C#] IEnumerable IDataSourceProvider.GetResolvedSelectedDataSource() { return (IEnumerable)((IDataSourceProvider)this).GetSelectedDataSource(); } object IDataSourceProvider.GetSelectedDataSource() { object selectedDataSource = null; string dataSource = null; DataBinding binding = DataBindings["DataSource"]; if (binding != null) { dataSource = binding.Expression; } if (dataSource != null) { ISite componentSite = Component.Site; if (componentSite != null) { IContainer container = (IContainer)componentSite.GetService(typeof(IContainer)); if (container != null) { IComponent comp = container.Components[dataSource]; if (comp is IEnumerable) { selectedDataSource = comp; } } } } return selectedDataSource; }
Unter Beispiel für einen datengebundenen Steuerelement-Designer mit Vorlagen in Web Forms finden Sie ein vollständiges Beispiel, das die vorherigen Schritte enthält.
Siehe auch
Beispiel für einen datengebundenen Steuerelement-Designer mit Vorlagen in Web Forms | Implementieren eines Vorlagen-Editors für Web Forms | Benutzerdefinierte Designer | Entwurfszeitunterstützung für Web Forms