Freigeben über


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.

  1. 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 {...}
    
  2. 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.

  3. 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.

  4. 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;
            }
    
  5. 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