Entwickeln von benutzerdefinierten datengebundenen Webserversteuerelementen für ASP.NET 2.0
Aktualisiert: November 2007
Datengebundene ASP.NET-Webserversteuerelemente verfügen über eine Benutzeroberfläche für eine Datenquelle, die eine Auflistung von Datensätzen oder Elementen darstellt. Beispiele für datengebundene Webserversteuerelemente sind die Serversteuerelemente Übersicht über das GridView-Webserversteuerelement, Übersicht über das DataList-Webserversteuerelement und Übersicht über das Repeater-Webserversteuerelement. Weitere Informationen über datengebundene ASP.NET-Steuerelemente finden Sie unter Übersicht über datengebundene ASP.NET-Webserversteuerelemente.
ASP.NET, Version 2.0, verfügt über ein neues Datenquellenmodell, das es Ihnen ermöglicht, datengebundene Steuerelemente an Datenquellensteuerelemente zu binden und so häufige Datenvorgänge wie Paging, Sortieren und Löschen aus dem datengebundenen Steuerelement zu verschieben. Dieses Modell bietet Seitenentwicklern ein flexibleres datengebundenes Steuerelement und bessere Wiederverwendungsmöglichkeiten.
Dieses Thema enthält eine Einführung in die Schritte, die erforderlich sind, um ein benutzerdefiniertes datengebundenes ASP.NET 2.0-Serversteuerelement zu implementieren. Weitere Informationen über die allgemeine Architektur und Implementierung von benutzerdefinierten Steuerelementen finden Sie unter Entwickeln von benutzerdefinierten ASP.NET-Serversteuerelementen und Exemplarische Vorgehensweise: Entwickeln und Verwenden eines benutzerdefinierten Serversteuerelements. Weitere Informationen über die Entwicklung von datengebundenen Steuerelementen, die mit ASP.NET 1.1 kompatibel sind, finden Sie unter Entwickeln von benutzerdefinierten datengebundenen Webserversteuerelementen für ASP.NET 1.1 und Exemplarische Vorgehensweise: Erstellen eines benutzerdefinierten datengebundenen ASP.NET-Websteuerelements für ASP.NET 1.1. Weitere Informationen zu Datenquellensteuerelementen finden Sie unter Übersicht über Datenquellensteuerelemente.
Gründe für die Erstellung eines benutzerdefinierten datengebundenen Steuerelements
Bevor Sie benutzerdefinierte datengebundene Steuerelemente erstellen, sollten Sie die Funktionen der mit ASP.NET bereitgestellten datengebundenen Steuerelemente überprüfen. Möglicherweise gibt es bereits ein Steuerelement, das Ihre Anforderungen erfüllt oder das über viele der gewünschten Features verfügt, sodass Sie es lediglich erweitern brauchen. Weitere Informationen über datengebundene ASP.NET-Steuerelemente finden Sie unter Übersicht über datengebundene ASP.NET-Webserversteuerelemente.
Nachfolgend finden Sie einige Gründe, die für die Erstellung eines benutzerdefinierten datengebundenen Steuerelements sprechen:
Ihre besonderen Anforderungen verlangen eine benutzerdefinierte Oberfläche und benutzerdefinierte Features zum Sortieren oder Bearbeiten von Daten, über die vorhandene datengebundene Steuerelemente nicht verfügen.
Sie möchten ein benutzerdefiniertes datengebundenes Steuerelement erstellen, das vorkompiliert und verteilbar ist.
Sie möchten die Features eines datengebundenen Steuerelements erweitern, das bereits mit ASP.NET bereitgestellt wird.
Sie möchten ein datengebundenes Steuerelement mit einem benutzerdefinierten Designer erstellen, der Ihre besonderen Anforderungen erfüllt.
Grundlegende Funktionalität eines benutzerdefinierten datengebundenen Steuerelements
Durch Ableiten von einer der Basisklassen des datengebundenen Steuerelements, wie der DataBoundControl-Klasse oder der CompositeDataBoundControl-Klasse, erbt das benutzerdefinierte datengebundene Steuerelement automatisch viele integrierte Features, z. B. folgende:
Datenquellenunterstützung für die IDataSource-Schnittstelle und ihre DataSourceView-Klasse, die benannte Ansichten von Daten, die Möglichkeit zum Abfragen der von der Datenquelle unterstützten Vorgänge und bedarfsabhängiges Laden von Daten bereitstellt.
Datenquellenunterstützung für die generische IEnumerable-Schnittstelle oder IListSource-Schnittstelle.
Unterstützung für Datenbindungsausdrücke, die es Seitenentwicklern ermöglicht, Bindungen zwischen einer verfügbar gemachten, speziell gekennzeichneten Eigenschaft des Steuerelements und einer Datenquelle zu erstellen. Weitere Informationen über Datenbindungsausdrücke finden Sie unter Übersicht über Datenbindungsausdrücke.
Unterstützung für automatische Datenbindung, die die Datenbindungslogik nicht bei jedem Postback, sondern so spät wie möglich im Seitenlebenszyklus und nur bei Bedarf aufruft. Nachdem eine Seite die erste Datenbindungsanforderung ausgeführt hat, versuchen nachfolgende Anforderungen, die Daten aus dem Ansichtszustand abzurufen. Auf diese Weise wird die Leistung verbessert, da nicht für jede Anforderung eine erneute Verbindung zur Datenquelle hergestellt werden muss.
Verwenden von verfügbaren Entwurfszeitfeatures
Alle Webserversteuerelemente verfügen über Entwurfszeitfeatures, die möglicherweise auch für benutzerdefinierte datengebundene Steuerelemente infrage kommen. Beispielsweise können Sie eine Designerklasse und Vorlagen für das benutzerdefinierte Steuerelement erstellen. Diese Features werden aufgerufen, wenn das Steuerelement zur Entwurfszeit auf einer visuellen Entwurfsoberfläche wie der Entwurfsansicht in Visual Studio verwendet wird.
Durch das Erstellen eines Steuerelement-Designers können Seitenentwickler das benutzerdefinierte Steuerelement zur Entwurfszeit deutlich effizienter nutzen, da die Steuerelementeigenschaften über eine Entwurfszeitoberfläche angepasst werden können. Eine Übersicht über die ASP.NET-Steuerelement-Designer finden Sie unter Übersicht über ASP.NET-Steuerelement-Designer. Beispiele zu diesem Thema finden Sie unter HierarchicalDataBoundControlDesigner und Exemplarische Vorgehensweise: Erstellen eines einfachen Steuerelement-Designers für ein Webserver-Steuerelement.
Die Erstellung eines Steuerelements mit Vorlagen verschafft Seitenentwicklern die Flexibilität, die Steuerelemente und das Markup zur Definition der Benutzeroberfläche des Steuerelements anzugeben. Ein Beispiel für ein benutzerdefiniertes Steuerelement mit Vorlagen finden Sie unter Beispiel für ein vorlagenbasiertes Serversteuerelement.
Implementieren eines benutzerdefinierten datengebundenen Steuerelements in ASP.NET 2.0
Die folgende Tabelle enthält eine Zusammenfassung der Implementierungsschritte für ein benutzerdefiniertes datengebundenes Serversteuerelement in ASP.NET 2.0. Nach der Tabelle finden Sie ausführlichere Informationen über die jeweiligen Implementierungsschritte.
Schritt |
Schrittzusammenfassung |
---|---|
Wählen Sie eine Basisklasse für das datengebundene Steuerelement aus. |
Erweitern Sie eine vorhandene datengebundene Steuerelementklasse, die bereits über viele der gewünschten Features verfügt, oder leiten Sie von einer der Basisklassen des datengebundenen Steuerelements ab. |
Machen Sie Datenbindungseigenschaften verfügbar. |
Konfigurieren Sie das benutzerdefinierte Steuerelement, indem Sie zusätzlich zu den mindestens erforderlichen Datenbindungseigenschaften, die von Basisklassen des datengebundenen Steuerelements verfügbar gemacht werden, weitere Datenbindungseigenschaften verfügbar machen. |
Initiieren Sie den Datenabruf. |
|
Behandeln Sie die abgerufenen Daten. |
Stellen Sie die Rückrufmethode bereit, die Sie als Parameter in der Select-Methode angegeben haben. Die Rückrufmethode muss über einen einzelnen Parameter vom Typ IEnumerable verfügen, um die Daten zu empfangen. Wenn das Steuerelement eine Verarbeitung der Daten erfordert, sollte sie innerhalb dieser Rückrufmethode erfolgen. |
Erstellen Sie die Benutzeroberflächenobjekte zur Darstellung der Daten. |
Stellen Sie eine Überschreibung der PerformDataBinding-Methode bereit. Sie müssen die folgenden Aufgaben innerhalb dieser Methode ausführen:
|
Auswählen einer Basisklasse für datengebundene Steuerelemente
Entwickler von Steuerelementen können eine der für datengebundene Steuerelemente verfügbaren Basisklassen erweitern, um ein benutzerdefiniertes datengebundenes Steuerelement zu erstellen. Die folgende Tabelle enthält eine Liste der datengebundenen Basisklassen, die in ASP.NET 2.0 verfügbar sind. Lesen Sie die Beschreibungen dieser Klassen, und bestimmen Sie anschließend, welche Basisklasse die Anforderungen des benutzerdefinierten datengebundenen Steuerelements am besten erfüllt. Ausführlichere Informationen über die Basisklassen für datengebundene Steuerelemente sowie Implementierungsbeispiele finden Sie in der Referenzdokumentation zu den jeweiligen Klassen. Weitere Informationen über datengebundene ASP.NET-Steuerelemente finden Sie unter Übersicht über datengebundene ASP.NET-Webserversteuerelemente.
Klasse |
Beschreibung |
---|---|
|
|
Dies ist die Basisklasse zum Erstellen standardmäßiger datengebundener Steuerelemente. DataBoundControl zeichnet sich wie folgt aus:
|
|
|
|
|
|
Verfügbare Datenbindungseigenschaften
Die Basisklassen des datengebundenen Steuerelements verfügen bereits über Datenbindungseigenschaften, die es einem Seitenentwickler ermöglichen, eine Datenquelle an ein Steuerelement zu binden. Dadurch bleibt dem Autor des Steuerelements zusätzliche Arbeit erspart. Durch Ableiten von DataBoundControl erbt ein benutzerdefiniertes Steuerelement beispielsweise drei verfügbar gemachte Datenbindungseigenschaften: DataSourceID, DataSource und DataMember. Anschließend kann der Seitenentwickler die Datenquelle angeben, an die das Steuerelement gebunden wird, indem er den Wert der DataSource-Eigenschaft oder DataSourceID-Eigenschaft festlegt.
Die DataSourceID-Eigenschaft ermöglicht es dem Seitenentwickler, die ID eines Steuerelements anzugeben, die der Datenquelle entspricht, aus der das datengebundene Steuerelement seine Daten abruft.
Mit der DataSource-Eigenschaft kann der Seitenentwickler ein datengebundenes Steuerelement direkt an Datenobjekte der beiden folgenden Typen binden:
Ein Objekt, das die IEnumerable-Schnittstelle implementiert (z. B. ein Array-, ArrayList- oder Hashtable-Objekt).
Ein Objekt, das die IListSource-Schnittstelle implementiert (z. B. ein DataSet-Objekt).
Zusätzliche Datenbindungseigenschaften wie die DataMember-Eigenschaft ermöglichen es dem Seitenentwickler, den Teil der Datenauflistung anzugeben, an den das Steuerelement gebunden werden soll.
Weitere Informationen über die von den Klassen oder Basisklassen datengebundener Steuerelemente verfügbar gemachten Datenbindungseigenschaften finden Sie in der Referenzdokumentation zu den jeweiligen Klassen.
Verfügbarmachen von benutzerdefinierten Datenbindungseigenschaften
Wenn Sie benutzerdefinierte Datenbindungseigenschaften in einem benutzerdefinierten Steuerelement verfügbar machen oder vorhandene Datenbindungseigenschaften überschreiben, sollten Sie die OnDataPropertyChanged-Methode aufrufen, falls das Steuerelement bereits initialisiert wurde. Dadurch wird das datengebundene Steuerelement gezwungen, die Daten erneut zu binden, um die neue Einstellung für die Datenbindungseigenschaft verwenden zu können.
Das folgende Codebeispiel zeigt eine Eigenschaft, die zu einer abgeleiteten datengebundenen Steuerelementklasse gehört. Es veranschaulicht, wie ein datengebundenes Steuerelement die OnDataPropertyChanged-Methode aufrufen kann, wenn eine Eigenschaft, die eine Datenquelle identifiziert, geändert wird, nachdem das datengebundene Steuerelement initialisiert wurde.
Inherits DataBoundControl
Public Property DataTextField() As String
Get
Dim o As Object = ViewState("DataTextField")
If o Is Nothing Then
Return String.Empty
Else
Return CStr(o)
End If
End Get
Set(ByVal value As String)
ViewState("DataTextField") = value
If (Initialized) Then
OnDataPropertyChanged()
End If
End Set
End Property
public class SimpleDataBoundColumn : DataBoundControl
{
public string DataTextField
{
get
{
object o = ViewState["DataTextField"];
return ((o == null) ? string.Empty : (string)o);
}
set
{
ViewState["DataTextField"] = value;
if (Initialized)
{
OnDataPropertyChanged();
}
}
}
Initiieren des Datenabrufs
Der Datenabruf wird innerhalb einer Überschreibung der PerformSelect-Methode initiiert, die von der Basisklasse des datengebundenen Steuerelements geerbt wird. Innerhalb dieser Überschreibung rufen Sie die Daten ab und geben eine Rückrufmethode zum Behandeln der zurückgegebenen Daten an.
Um die Daten abzurufen, führen Sie die folgenden Aufgaben in der überschriebenen PerformSelect-Methode aus:
Stellen Sie fest, ob der Seitenentwickler die DataSource-Eigenschaft oder die DataSourceID-Eigenschaft verwendet hat, um die Daten festzulegen, die an das Steuerelement gebunden werden sollen. Überprüfen Sie dazu die IsBoundUsingDataSourceID-Eigenschaft. Beispielsweise weist die Einstellung false für die IsBoundUsingDataSourceID-Eigenschaft darauf hin, dass zum Festlegen der Datenquelle die DataSource-Eigenschaft verwendet wurde.
Wenn der Seitenentwickler die DataSource-Eigenschaft festgelegt hat, ist ein zusätzlicher Schritt erforderlich: Rufen Sie die OnDataBinding-Methode auf.
Rufen Sie die GetData-Methode auf, um das dem datengebundenen Steuerelement zugeordnete DataSourceView-Objekt abzurufen.
Rufen Sie die Select-Methode des abgerufenen DataSourceView-Objekts auf, um den Datenabruf zu initiieren, und geben Sie die Rückrufmethode zum Behandeln der abgerufenen Daten an. Die Select-Methode funktioniert asynchron, sodass während des Datenabrufs weitere Verarbeitungen stattfinden können.
Geben Sie die Beendigung der PerformSelect-Aufgaben an, indem Sie die RequiresDataBinding-Eigenschaft auf false festlegen und anschließend die MarkAsDataBound-Methode aufrufen.
Lösen Sie das OnDataBound-Ereignis aus.
Das folgende Codebeispiel veranschaulicht die voranstehenden Aufgaben für den Datenabruf, die innerhalb einer Überschreibung der PerformSelect-Methode durchgeführt wurden.
Protected Overrides Sub PerformSelect()
' Call OnDataBinding here if bound to a data source using the
' DataSource property (instead of a DataSourceID), because the
' databinding statement is evaluated before the call to GetData.
If Not IsBoundUsingDataSourceID Then
OnDataBinding(EventArgs.Empty)
End If
' The GetData method retrieves the DataSourceView object from
' the IDataSource associated with the data-bound control.
GetData().Select(CreateDataSourceSelectArguments(), _
AddressOf OnDataSourceViewSelectCallback)
' The PerformDataBinding method has completed.
RequiresDataBinding = False
MarkAsDataBound()
' Raise the DataBound event.
OnDataBound(EventArgs.Empty)
End Sub
protected override void PerformSelect()
{
// Call OnDataBinding here if bound to a data source using the
// DataSource property (instead of a DataSourceID), because the
// databinding statement is evaluated before the call to GetData.
if (!IsBoundUsingDataSourceID)
{
this.OnDataBinding(EventArgs.Empty);
}
// The GetData method retrieves the DataSourceView object from
// the IDataSource associated with the data-bound control.
GetData().Select(CreateDataSourceSelectArguments(),
this.OnDataSourceViewSelectCallback);
// The PerformDataBinding method has completed.
RequiresDataBinding = false;
MarkAsDataBound();
// Raise the DataBound event.
OnDataBound(EventArgs.Empty);
}
Behandeln der abgerufenen Daten
Erstellen Sie eine Rückrufmethode, um die abgerufenen Daten zu akzeptieren. Dies ist die Rückrufmethode, die Sie angegeben haben, als die Select-Methode innerhalb der Überschreibung der PerformSelect-Methode aufgerufen wurde. Die Rückrufmethode muss über einen einzelnen Parameter vom Typ IEnumerable verfügen. In der Rückrufmethode können Sie die zurückgegebenen Daten beliebig verarbeiten, falls dies vom Steuerelement vorausgesetzt wird. Rufen Sie zuletzt die PerformDataBinding-Methode auf.
Das folgende Codebeispiel veranschaulicht eine Rückrufmethode, die über einen Parameter vom Typ IEnumerable verfügt und die PerformDataBinding-Methode aufruft.
Private Sub OnDataSourceViewSelectCallback(ByVal retrievedData As IEnumerable)
' Call OnDataBinding only if it has not already been
' called in the PerformSelect method.
If IsBoundUsingDataSourceID Then
OnDataBinding(EventArgs.Empty)
End If
' The PerformDataBinding method binds the data in the
' retrievedData collection to elements of the data-bound control.
PerformDataBinding(retrievedData)
End Sub
private void OnDataSourceViewSelectCallback(IEnumerable retrievedData)
{
// Call OnDataBinding only if it has not already been
// called in the PerformSelect method.
if (IsBoundUsingDataSourceID)
{
OnDataBinding(EventArgs.Empty);
}
// The PerformDataBinding method binds the data in the
// retrievedData collection to elements of the data-bound control.
PerformDataBinding(retrievedData);
}
Erstellen der Benutzeroberflächenobjekte zur Darstellung der Daten
Innerhalb einer Überschreibung der PerformDataBinding-Methode erstellen Sie untergeordnete Steuerelemente zur Darstellung der Daten. Die Datenauflistung wird aufgelistet, und die untergeordneten Steuerelemente, deren Eigenschaften auf den einzelnen Datenelementen basieren, werden erstellt. Durch Hinzufügen der neuen untergeordneten Steuerelemente zur Controls-Auflistung des Steuerelements werden die untergeordneten Steuerelemente wiedergegeben. In der Steuerelementhierarchie erfolgt die Wiedergabe während der geerbten Render-Methode des Steuerelements. Wahlweise können Sie die Render-Methode überschreiben, um eine spezielle Wiedergabe für das benutzerdefinierte Steuerelement durchzuführen, beispielsweise zum Hinzufügen zusätzlicher HTML-Elemente oder zur Anzeige im Entwurfsmodus.
Um die Benutzeroberflächenobjekte zur Darstellung der Daten zu erstellen, überschreiben Sie die PerformDataBinding-Methode, und führen Sie die folgenden Aufgaben aus:
Rufen Sie die PerformDataBinding-Methode auf, um die Ausführung jedes Codes zuzulassen, der auf dieser Methode basiert.
Durchlaufen Sie die Datenauflistung, und erstellen Sie untergeordnete Steuerelemente zur Darstellung der Daten in der Benutzeroberflächenanzeige. Fügen Sie alle untergeordneten Steuerelemente der Auflistung des Steuerelements hinzu, indem Sie die Add-Methode des Steuerelements aufrufen.
- Das folgende Codebeispiel veranschaulicht das Überschreiben der PerformDataBinding-Methode. Die PerformDataBinding-Methode wird aufgerufen, um die Ausführung jedes Codes zuzulassen, der auf dieser Methode basiert. Die Datenauflistung wird aufgelistet, und es werden untergeordnete Steuerelemente zur Darstellung der Daten in der Benutzeroberflächenanzeige erstellt.
Protected Overrides Sub PerformDataBinding(ByVal retrievedData As IEnumerable)
MyBase.PerformDataBinding(retrievedData)
' Verify data exists.
If Not (retrievedData Is Nothing) Then
Dim tbl As New Table()
Dim row As TableRow
Dim cell As TableCell
Dim dataStr As String = String.Empty
Dim dataItem As Object
For Each dataItem In retrievedData
' If the DataTextField was specified get the data
' from that field, otherwise get the data from the first field.
If DataTextField.Length > 0 Then
dataStr = DataBinder.GetPropertyValue(dataItem, DataTextField, Nothing)
Else
Dim props As PropertyDescriptorCollection = TypeDescriptor.GetProperties(dataItem)
If props.Count >= 1 Then
If Nothing <> props(0).GetValue(dataItem) Then
dataStr = props(0).GetValue(dataItem).ToString()
End If
End If
End If
row = New TableRow()
tbl.Rows.Add(row)
cell = New TableCell()
cell.Text = dataStr
row.Cells.Add(cell)
Next dataItem
Controls.Add(tbl)
End If
End Sub
End Class
End Namespace
protected override void PerformDataBinding(IEnumerable retrievedData)
{
base.PerformDataBinding(retrievedData);
// Verify data exists.
if (retrievedData != null)
{
Table tbl = new Table();
TableRow row;
TableCell cell;
string dataStr = String.Empty;
foreach (object dataItem in retrievedData)
{
// If the DataTextField was specified get the data
// from that field, otherwise get the data from the first field.
if (DataTextField.Length > 0)
{
dataStr = DataBinder.GetPropertyValue(dataItem,
DataTextField, null);
}
else
{
PropertyDescriptorCollection props =
TypeDescriptor.GetProperties(dataItem);
if (props.Count >= 1)
{
if (null != props[0].GetValue(dataItem))
{
dataStr = props[0].GetValue(dataItem).ToString();
}
}
}
row = new TableRow();
tbl.Rows.Add(row);
cell = new TableCell();
cell.Text = dataStr;
row.Cells.Add(cell);
}
this.Controls.Add(tbl);
}
}
Erstellen des benutzerdefinierten Serversteuerelements
Weitere Informationen zum Erstellen des benutzerdefinierten datengebundenen Webserversteuerelements und dessen Verwendung auf einer Webseite finden Sie unter Erstellen der Beispiele für benutzerdefinierte Serversteuerelemente.
Siehe auch
Aufgaben
Konzepte
Übersicht über datengebundene ASP.NET-Webserversteuerelemente
Metadatenattribute für benutzerdefinierte Serversteuerelemente
Übersicht über ASP.NET-Steuerelement-Designer
Referenz
HierarchicalDataBoundControlDesigner
Weitere Ressourcen
Entwickeln von benutzerdefinierten ASP.NET-Serversteuerelementen