Formate in Serversteuerelementen
Formate bestimmen die visuelle Darstellung eines Steuerelements. Wenn Sie ein Formate unterstützendes Steuerelement entwickeln, empfiehlt sich die Ableitung von System.Web.UI.WebControls.WebControl, wodurch streng typisierte Eigenschaften (z. B. Font, Height, Width usw.) offen gelegt und Methoden zur Arbeit mit Formateigenschaften bereitgestellt werden. Einen Überblick über Formate in ASP.NET-Steuerelementen finden Sie unter Schnelleinstieg zu ASP.NET —> ASP.NET Web Forms —> Anwenden von Formaten auf Steuerelemente.
Die WebControl-Klasse bietet zwei Techniken zur Unterstützung von Formaten:
- Offenlegen streng typisierter Formateigenschaften vom Typ System.Web.UI.WebControl.Style oder von Typen, die von System.Web.UI.WebControl.Style abgeleitet sind.
- Ausgeben von Formaten als HTML-Attribute durch Hinzufügen von Name/Wert-Paaren zur WebControl.Style-Auflistung. Diese Technik sollte bei der Entwicklung von Steuerelementen nicht verwendet werden. Die Technik ist dafür gedacht, dass Benutzer vom Steuerelement nicht offen gelegte Formate als streng typisierte Eigenschaften zu diesem hinzufügen können. Die Steuerelementbenutzer können auf diese Weise Formate sowohl programmgesteuert als auch deklarativ festlegen. Siehe dazu Schnelleinstieg zu ASP.NET —> ASP.NET Web Forms —> Anwenden von Formaten auf Steuerelemente.
Offenlegen streng typisierter Formateigenschaften
Ein Webserversteuerelement (ein von WebControl abgeleitetes Serversteuerelement) erbt die WebControl.ControlStyle-Eigenschaft, welche das typisierte Format für das Steuerelement als Ganzes festlegt. Der Typ von ControlStyle ist Style. Dies ist eine Klasse, die die das Format betreffende Funktionalität einkapselt, wie in der folgenden Liste beschrieben.
Style besitzt Eigenschaften wie Font, Height, Width, ForeColor, BackColor sowie andere, die mit Formaten von Cascading Stylesheets korrespondieren. WebControl legt diese Formateigenschaften als Eigenschaften der obersten Ebene offen, indem sie an Untereigenschaften der eigenen ControlStyle-Eigenschaft delegiert werden.
Style legt zum Darstellen von Formaten als Attribute eines HtmlTextWriter-Objekts eine Methode (Style.AddAttributesToRender) offen. Dadurch wird WebControl in die Lage versetzt, die Formatdarstellung an die eigene ControlStyle-Eigenschaft zu delegieren.
Hinweis Wenn Sie die Render-Methode von WebControl außer Kraft setzen, müssen Sie sicherstellen, dass die von WebControl bereitgestellte grundlegende Darstellungsfunktionalität erhalten bleibt. Wenn Sie beispielsweise die Render-Methode dahingehend außer Kraft setzen, dass die Write-Methode der HtmlTextWriter-Instanz direkt aufgerufen wird, geht die in WebControl integrierte Formatdarstellungsfunktionalität verloren. Ein Beispiel für die empfohlene Technik zum Außerkraftsetzen von Render finden Sie unter Beispiele für die Darstellung eines Serversteuerelements.
Style bietet Methoden zum Kopieren (Style.CopyFrom) und Zusammenführen (Style.MergeWith) von Formaten. Ein Beispiel für die Verwendung dieser Methoden finden Sie unter Beispiel für ein datengebundenes Steuerelement mit Vorlagen.
Style implementiert die IStateManager-Schnittstelle, die jene Statusverwaltungsfunktionalität bereitstellt, die es einem Steuerelement gestattet, die Statusverwaltung an seine Formateigenschaften zu delegieren. Als Teil des IStateManager-Vertrags implementiert Style beispielsweise die Methoden LoadViewState, SaveViewState und TrackViewState. Style verfügt außerdem über einen überladenen Konstruktor, der einen StateBag-Typ als Argument benötigt. WebControl erstellt ControlStyle durch Weiterleiten von ViewState an den Style-Konstruktor, wodurch es dem Steuerelementformat ermöglicht wird, auf den Ansichtsstatus zuzugreifen. Ein Beispiel für die Delegierung einer angepassten Statusverwaltung an die Formateigenschaften eines Steuerelements finden Sie unter Beispiel für ein datengebundenes Steuerelement mit Vorlagen.
Während der Standardtyp der ControlStyle-Eigenschaft Style ist, kann ein Webserversteuerelement seinen Steuerelementformat auf eine beliebige von Style abgeleitete Klasse festlegen, indem die WebControl.CreateControlStyle-Methode außer Kraft gesetzt wird, wie im folgenden Beispiel zu sehen.
protected override Style CreateControlStyle()
{
// Note that the constructor of Style takes ViewState as an
// argument.
TableStyle style = new TableStyle(ViewState);
// Set up default initial state.
style.CellSpacing = 0;
return style;
}
[Visual Basic]
Protected Overrides Function CreateControlStyle() As Style
' Note that the constructor of Style takes ViewState as an
' argument.
Dim style As New TableStyle(ViewState)
' Set up default initial state.
style.CellSpacing = 0
Return style
End Function
Neben dem Basistyp Style bietet der System.Web.UI.WebControls-Namespace weitere Formattypen, z. B. TableStyle und TableItemStyle. Sie können zusätzliche streng typisierte Formate durch Ableitung von Style (oder von einer anderen von Style abgeleiteten Klasse) und Außerkraftsetzen oder Hinzufügen von Membern definieren. So wie WebControl Untereigenschaften von Style als Eigenschaften der obersten Ebene offen legt, können Sie Untereigenschaften des benutzerdefinierten Formattyps als Eigenschaften der obersten Ebene offen legen. Table bestimmt beispielsweise ControlStyle als TableStyle und legt Untereigenschaften von TableStyle als Eigenschaften der obersten Ebene offen, z. B. CellPadding, CellSpacing und Gridlines. Das folgende Codefragment aus Beispiel für ein datengebundenes Steuerelement mit Vorlagen zeigt, wie das benutzerdefinierte TemplatedList
-Steuerelement die CellPadding-Untereigenschaft von ControlStyle als Eigenschaft der obersten Ebene offen legt.
public virtual int CellPadding {
get {
if (ControlStyleCreated == false) {
return -1;
}
return ((TableStyle)ControlStyle).CellPadding;
}
set {
((TableStyle)ControlStyle).CellPadding = value;
}
}
[Visual Basic]
Public Overridable Property CellPadding() As Integer
Get
If ControlStyleCreated = False Then
Return - 1
End If
Return CType(ControlStyle, TableStyle).CellPadding
End Get
Set
CType(ControlStyle, TableStyle).CellPadding = value
End Set
End Property
Die folgenden Methoden von WebControl ermöglichen es dem Benutzer eines Steuerelements, die ControlStyle-Eigenschaft des Steuerelements zu ändern.
- Die WebControl.ApplyStyle-Methode kopiert ein angegebenes Format nach ControlStyle und überschreibt vorhandene Elemente.
- Die WebControl.ApplyStyle-Methode führt ein angegebenes Format mit ControlStyle zusammen, ohne vorhandene Elemente zu überschreiben.
Beispiele für die Verwendung dieser Methoden finden Sie unter Beispiel für ein datengebundenes Steuerelement mit Vorlagen.
Offenlegen zusätzlicher Formateigenschaften für untergeordnete Steuerelemente
Während die ControlStyle-Eigenschaft das allgemeine Format eines Webserversteuerelements bestimmt, kann ein zusammengesetztes Webserversteuerelement (eines mit untergeordneten Steuerelementen) zusätzliche auf die untergeordneten Steuerelemente anzuwendende Formateigenschaften offen legen. Ein Steuerelement muss die angepasste Statusverwaltung implementieren, um diese zusätzlichen Formate bei Clientschleifen zu erhalten. Die folgende Liste beschreibt die Hauptschritte zur Bereitstellung zusätzlicher Formate.
So legen Sie Formate für untergeordnete Steuerelemente offen
Definieren Sie eine oder mehrere von Style abgeleitete Eigenschaften. Das benutzerdefinierte
TemplatedList
-Steuerelement, beschrieben unter Beispiel für ein datengebundenes Steuerelement mit Vorlagen, legt zusätzliche Formate offen, wie im folgenden Codefragment demonstriert. Beachten Sie, dass in diesem Fall bei der Erstellung eines neuen Style-Objekts die ViewState-Eigenschaft des Steuerelements nicht an den Style-Konstruktor weitergegeben wird. Die ViewState-Eigenschaft eines Steuerelements wird nur an den Style-Konstruktor weitergegeben, wenn eine ControlStyle-Eigenschaft des Steuerelements erstellt wird. (Dies gilt nicht für andere Eigenschaften vom Typ Style.) Beachten Sie außerdem, dass das Steuerelement die Anzeigestatusverfolgung an die Formateigenschaft delegiert.public virtual TableItemStyle AlternatingItemStyle { get { if (alternatingItemStyle == null) { alternatingItemStyle = new TableItemStyle(); if (IsTrackingViewState) ((IStateManager)alternatingItemStyle).TrackViewState(); } return alternatingItemStyle; } } [Visual Basic] Public Overridable ReadOnly Property AlternatingItemStyle() As TableItemStyle Get If _alternatingItemStyle Is Nothing Then _alternatingItemStyle = New TableItemStyle() If IsTrackingViewState Then CType(_alternatingItemStyle, IStateManager).TrackViewState() End If End If Return _alternatingItemStyle End Get End Property
Wenden Sie die Formate auf die untergeordneten Steuerelemente an. Ein Beispiel ist die
PrepareControlHierarchy
-Methode unter Beispiel für ein datengebundenes Steuerelement mit Vorlagen, die auch das Zusammenführen von Formaten demonstriert. Sie sollten Formate in der Darstellungsphase auf die untergeordneten Steuerelemente anwenden (siehe voriges Beispiel), so dass sie im Anzeigestatus nicht beibehalten werden.Setzen Sie die SaveViewState-Methode außer Kraft, um die zusätzlichen Formateigenschaften in ViewState zu speichern. Da Style-Objekte ihren eigenen Status verwalten, muss ein Steuerelement SaveViewState für seine Formateigenschaften aufrufen, um die Objekte zu erhalten, die zur ViewState-Eigenschaft hinzugefügt werden müssen. Das folgende Beispiel aus Beispiel für ein datengebundenes Steuerelement mit Vorlagen zeigt, wie ein Steuerelement die angepasste Statusverwaltung an seine Formateigenschaften delegiert.
protected override object SaveViewState() { // Customized state management to handle saving // state of contained objects such as styles. object baseState = base.SaveViewState(); object itemStyleState = (itemStyle != null) ? ((IStateManager)itemStyle).SaveViewState() : null; object selectedItemStyleState = (selectedItemStyle != null) ? ((IStateManager)selectedItemStyle).SaveViewState() : null; object alternatingItemStyleState = (alternatingItemStyle != null) ? ((IStateManager)alternatingItemStyle).SaveViewState() : null; object[] myState = new object[4]; myState[0] = baseState; myState[1] = itemStyleState; myState[2] = selectedItemStyleState; myState[3] = alternatingItemStyleState; return myState; } [Visual Basic] Protected Overrides Function SaveViewState() As Object ' Customized state management to handle saving ' state of contained objects such as styles. Dim baseState As Object = MyBase.SaveViewState() Dim itemStyleState As Object Dim selectedItemStyleState As Object Dim alternatingItemStyleState As Object If Not (_itemStyle Is Nothing) Then itemStyleState = CType(_itemStyle, IStateManager).SaveViewState() Else itemStyleState = Nothing End If If Not (_selectedItemStyle Is Nothing) Then selectedItemStyleState = CType(_selectedItemStyle, IStateManager).SaveViewState() Else selectedItemStyleState = Nothing End If If Not (_alternatingItemStyle Is Nothing) Then alternatingItemStyleState = CType(_alternatingItemStyle, IStateManager).SaveViewState() Else alternatingItemStyleState = Nothing End If Dim myState(4) As Object myState(0) = baseState myState(1) = itemStyleState myState(2) = selectedItemStyleState myState(3) = alternatingItemStyleState Return myState End Function
Setzen Sie die LoadViewState-Methode außer Kraft, um die Wiederherstellung der zusätzlichen Formateigenschaften von ViewState anzupassen. Die zusätzlichen zu ViewState hinzugefügten Objekte müssen jetzt in derselben Reihenfolge abgerufen werden, in der sie hinzugefügt wurden. Das folgende Beispiel aus Beispiel für ein datengebundenes Steuerelement mit Vorlagen zeigt, wie ein Steuerelement die angepasste Statuswiederherstellung an seine Formateigenschaften delegiert.
protected override void LoadViewState(object savedState) { // Customized state management to handle // state restoration of contained objects. if (savedState != null) { object[] myState = (object[])savedState; if (myState[0] != null) base.LoadViewState(myState[0]); if (myState[1] != null) ((IStateManager)ItemStyle).LoadViewState(myState[1]); if (myState[2] != null) ((IStateManager)SelectedItemStyle).LoadViewState(myState[2]); if (myState[3] != null) ((IStateManager)AlternatingItemStyle).LoadViewState(myState[3]); } } [Visual Basic] Protected Overrides Sub LoadViewState(savedState As Object) ' Customized state management to handle saving ' state of contained objects. If Not (savedState Is Nothing) Then Dim myState As Object() = CType(savedState, Object()) If Not (myState(0) Is Nothing) Then MyBase.LoadViewState(myState(0)) End If If Not (myState(1) Is Nothing) Then CType(ItemStyle, IStateManager).LoadViewState(myState(1)) End If If Not (myState(2) Is Nothing) Then CType(SelectedItemStyle, IStateManager).LoadViewState(myState(2)) End If If Not (myState(3) Is Nothing) Then CType(AlternatingItemStyle, IStateManager).LoadViewState(myState(3)) End If End If End Sub
Ein Beispiel für ein Steuerelement, dass die auf seine untergeordneten Steuerelemente angewendeten Formateigenschaften offen legt, finden Sie unter Beispiel für ein datengebundenes Steuerelement mit Vorlagen.