Esempio di stili tipizzati per controlli figlio
Aggiornamento: novembre 2007
In questo esempio vengono illustrate le modalità di creazione di un controllo denominato StyledRegister, che implementa proprietà di stile fortemente tipizzate in un controllo composito. Queste proprietà consentono allo sviluppatore della pagina di personalizzare l'aspetto dei controlli figlio del controllo composito. Gli stili tipizzati semplificano la scalabilità dei controlli compositi. L'aumento del numero di controlli figlio aggiunti al controllo composito rende difficile la gestione dell'esposizione delle numerose proprietà di ogni controllo figlio nel controllo composito. È però possibile incapsulare molte proprietà in un'unica proprietà di stile.
Il controllo StyledRegister dell'esempio è simile al controllo Register descritto in Esempio di controllo Web composito. Il controllo StyledRegister dispone di due controlli figlio TextBox e di un controllo figlio Button. La classe StyledRegister espone le proprietà ButtonStyle e TextBoxStyle per consentire allo sviluppatore della pagina di impostare Font, ForeColor e altre proprietà dei controlli figlio TextBox e Button correlate allo stile.
Lo sviluppatore della pagina può impostare le proprietà Font-Names, ForeColor e BackColor dei controlli nel controllo StyledRegister, come illustrato nel seguente esempio:
<aspSample:StyledRegister ID="StyledRegister1" >
<TextBoxStyle Font-Names="Arial" BorderStyle="Solid"
ForeColor="#804000"></TextBoxStyle>
<ButtonStyle Font-Names="Arial" BorderStyle="Outset"
BackColor="Silver"></ButtonStyle>
</aspSample:StyledRegister>
Come illustrato nell'esempio precedente, le proprietà di stile fortemente tipizzate vengono mantenute come elementi figlio all'interno dei tag del controllo. Per informazioni sull'implementazione delle proprietà mantenute in tal modo, vedere l'implementazione della proprietà Author in Esempio di proprietà dei controlli server.
Uno stile tipizzato è una proprietà di tipo Style o di un tipo derivato da Style. La classe Style espone le proprietà correlate all'aspetto, quali Font, ForeColor e BackColor. La proprietà ControlStyle della classe WebControl è di tipo Style. Le proprietà Font, ForeColor e BackColor di un controllo Web sono sottoproprietà di ControlStyle, sebbene anch'esse vengano esposte come proprietà di primo livello della classe WebControl.
Poiché la classe Style dispone di sottoproprietà, le proprietà di tipo Style richiedono la gestione dello stato personalizzato, come descritto in Esempio di gestione dello stato delle proprietà personalizzate. I dettagli dell'implementazione degli stili tipizzati vengono descritti nella sezione "Illustrazione del codice" più avanti in questo argomento.
Listato di codice per il controllo StyledRegister
' StyledRegister.vb
Option Strict On
Imports System
Imports System.ComponentModel
Imports System.Drawing
Imports System.Security.Permissions
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Namespace Samples.AspNet.VB.Controls
< _
AspNetHostingPermission(SecurityAction.Demand, _
Level:=AspNetHostingPermissionLevel.Minimal), _
AspNetHostingPermission(SecurityAction.InheritanceDemand, _
Level:=AspNetHostingPermissionLevel.Minimal), _
DefaultEvent("Submit"), _
DefaultProperty("ButtonText"), _
ToolboxData("<{0}:Register runat=""server""> </{0}:Register>") _
> _
Public Class StyledRegister
Inherits CompositeControl
Private submitButton As Button
Private nameTextBox As TextBox
Private nameLabel As Label
Private emailTextBox As TextBox
Private emailLabel As Label
Private emailValidator As RequiredFieldValidator
Private nameValidator As RequiredFieldValidator
Private Shared ReadOnly EventSubmitKey As New Object()
Private buttonStyleValue As Style
Private textBoxStyleValue As Style
#Region "Properties delegated to child controls"
< _
Bindable(True), _
Category("Appearance"), _
DefaultValue(""), _
Description("The text to display on the Button.") _
> _
Public Property ButtonText() As String
Get
EnsureChildControls()
Return submitButton.Text
End Get
Set(ByVal value As String)
EnsureChildControls()
submitButton.Text = value
End Set
End Property
< _
Bindable(True), _
Category("Default"), _
DefaultValue(""), _
Description("The user name.") _
> _
Public Property Name() As String
Get
EnsureChildControls()
Return nameTextBox.Text
End Get
Set(ByVal value As String)
EnsureChildControls()
nameTextBox.Text = value
End Set
End Property
< _
Bindable(True), _
Category("Appearance"), _
DefaultValue(""), _
Description("The error message of the name validator.") _
> _
Public Property NameErrorMessage() As String
Get
EnsureChildControls()
Return nameValidator.ErrorMessage
End Get
Set(ByVal value As String)
EnsureChildControls()
nameValidator.ErrorMessage = value
nameValidator.ToolTip = value
End Set
End Property
< _
Bindable(True), _
Category("Appearance"), _
DefaultValue(""), _
Description("The text for the name Label.") _
> _
Public Property NameLabelText() As String
Get
EnsureChildControls()
Return nameLabel.Text
End Get
Set(ByVal value As String)
EnsureChildControls()
nameLabel.Text = value
End Set
End Property
< _
Bindable(True), _
Category("Default"), _
DefaultValue(""), _
Description("The e-mail address.") _
> _
Public Property Email() As String
Get
EnsureChildControls()
Return emailTextBox.Text
End Get
Set(ByVal value As String)
EnsureChildControls()
emailTextBox.Text = value
End Set
End Property
< _
Bindable(True), _
Category("Appearance"), _
DefaultValue(""), _
Description("Error message of the e-mail validator.") _
> _
Public Property EmailErrorMessage() As String
Get
EnsureChildControls()
Return emailValidator.ErrorMessage
End Get
Set(ByVal value As String)
EnsureChildControls()
emailValidator.ErrorMessage = value
emailValidator.ToolTip = value
End Set
End Property
< _
Bindable(True), _
Category("Appearance"), _
DefaultValue(""), _
Description("The text for the e-mail Label.") _
> _
Public Property EmailLabelText() As String
Get
EnsureChildControls()
Return emailLabel.Text
End Get
Set(ByVal value As String)
EnsureChildControls()
emailLabel.Text = value
End Set
End Property
#End Region
#Region "Typed Style properties"
< _
Category("Styles"), _
DefaultValue(GetType(Style), Nothing), _
DesignerSerializationVisibility( _
DesignerSerializationVisibility.Content), _
PersistenceMode(PersistenceMode.InnerProperty), _
Description( _
"The strongly typed style for the Button child control.") _
> _
Public Overridable ReadOnly Property ButtonStyle() As Style
Get
If buttonStyleValue Is Nothing Then
buttonStyleValue = New Style
If IsTrackingViewState Then
CType(buttonStyleValue, _
IStateManager).TrackViewState()
End If
End If
Return buttonStyleValue
End Get
End Property
< _
Category("Styles"), _
DefaultValue(GetType(Style), Nothing), _
DesignerSerializationVisibility( _
DesignerSerializationVisibility.Content), _
PersistenceMode(PersistenceMode.InnerProperty), _
Description( _
"The strongly typed style for the TextBox child control.") _
> _
Public Overridable ReadOnly Property TextBoxStyle() As Style
Get
If textBoxStyleValue Is Nothing Then
textBoxStyleValue = New Style
If IsTrackingViewState Then
CType(textBoxStyleValue, _
IStateManager).TrackViewState()
End If
End If
Return textBoxStyleValue
End Get
End Property
#End Region
#Region "Event definition"
< _
Category("Action"), _
Description("Raised when the user clicks the button.") _
> _
Public Custom Event Submit As EventHandler
AddHandler(ByVal value As EventHandler)
Events.AddHandler(EventSubmitKey, value)
End AddHandler
RemoveHandler(ByVal value As EventHandler)
Events.RemoveHandler(EventSubmitKey, value)
End RemoveHandler
RaiseEvent(ByVal sender As Object, _
ByVal e As System.EventArgs)
CType(Events(EventSubmitKey), _
EventHandler).Invoke(sender, e)
End RaiseEvent
End Event
' The method that raises the Submit event.
Protected Overridable Sub OnSubmit(ByVal e As EventArgs)
Dim submitHandler As EventHandler = _
CType(Events(EventSubmitKey), EventHandler)
If submitHandler IsNot Nothing Then
submitHandler(Me, e)
End If
End Sub
' Handles the Click event of the Button and raises
' the Submit event.
Private Sub submitButton_Click(ByVal source As Object, _
ByVal e As EventArgs)
OnSubmit(EventArgs.Empty)
End Sub
#End Region
#Region "Overridden methods"
Protected Overrides Sub CreateChildControls()
Controls.Clear()
nameLabel = New Label()
nameTextBox = New TextBox()
nameTextBox.ID = "nameTextBox"
nameValidator = New RequiredFieldValidator()
nameValidator.ID = "validator1"
nameValidator.ControlToValidate = nameTextBox.ID
nameValidator.Text = "*"
nameValidator.Display = ValidatorDisplay.Static
emailLabel = New Label()
emailTextBox = New TextBox()
emailTextBox.ID = "emailTextBox"
emailValidator = New RequiredFieldValidator()
emailValidator.ID = "validator2"
emailValidator.ControlToValidate = emailTextBox.ID
emailValidator.Text = "*"
emailValidator.Display = ValidatorDisplay.Static
submitButton = New Button()
submitButton.ID = "button1"
AddHandler submitButton.Click, _
AddressOf submitButton_Click
Me.Controls.Add(nameLabel)
Me.Controls.Add(nameTextBox)
Me.Controls.Add(nameValidator)
Me.Controls.Add(emailLabel)
Me.Controls.Add(emailTextBox)
Me.Controls.Add(emailValidator)
Me.Controls.Add(submitButton)
End Sub
Protected Overrides Sub Render(ByVal writer As HtmlTextWriter)
AddAttributesToRender(writer)
writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, _
"1", False)
writer.RenderBeginTag(HtmlTextWriterTag.Table)
If buttonStyleValue IsNot Nothing Then
submitButton.ApplyStyle(buttonStyleValue)
End If
If textBoxStyleValue IsNot Nothing Then
nameTextBox.ApplyStyle(textBoxStyleValue)
emailTextBox.ApplyStyle(textBoxStyleValue)
End If
writer.RenderBeginTag(HtmlTextWriterTag.Tr)
writer.RenderBeginTag(HtmlTextWriterTag.Td)
nameLabel.RenderControl(writer)
writer.RenderEndTag() ' Renders the </td> tag.
writer.RenderBeginTag(HtmlTextWriterTag.Td)
nameTextBox.RenderControl(writer)
writer.RenderEndTag() 'closing Td
writer.RenderBeginTag(HtmlTextWriterTag.Td)
nameValidator.RenderControl(writer)
writer.RenderEndTag() 'closing Td
writer.RenderEndTag() 'closing Tr
writer.RenderBeginTag(HtmlTextWriterTag.Tr)
writer.RenderBeginTag(HtmlTextWriterTag.Td)
emailLabel.RenderControl(writer)
writer.RenderEndTag() 'closing Td
writer.RenderBeginTag(HtmlTextWriterTag.Td)
emailTextBox.RenderControl(writer)
writer.RenderEndTag() 'closing Td
writer.RenderBeginTag(HtmlTextWriterTag.Td)
emailValidator.RenderControl(writer)
writer.RenderEndTag() 'closing Td
writer.RenderEndTag() 'closing Tr
writer.RenderBeginTag(HtmlTextWriterTag.Tr)
writer.AddAttribute(HtmlTextWriterAttribute.Colspan, _
"2", False)
writer.AddAttribute(HtmlTextWriterAttribute.Align, _
"right", False)
writer.RenderBeginTag(HtmlTextWriterTag.Td)
submitButton.RenderControl(writer)
writer.RenderEndTag() 'closing Td
writer.RenderBeginTag(HtmlTextWriterTag.Td)
writer.Write(" ")
writer.RenderEndTag() 'closing Td
writer.RenderEndTag() 'closing Tr
writer.RenderEndTag() 'closing Table
End Sub
Protected Overrides Sub RecreateChildControls()
EnsureChildControls()
End Sub
#End Region
#Region "Custom state management"
Protected Overrides Sub LoadViewState( _
ByVal savedState As Object)
If savedState is Nothing Then
MyBase.LoadViewState(Nothing)
Return
Else
Dim t As Triplet = TryCast(savedState, Triplet)
If t IsNot Nothing Then
' Always invoke LoadViewState on the base class even if
' the saved state is null.
MyBase.LoadViewState(t.First)
If t.Second IsNot Nothing Then
CType(buttonStyleValue, _
IStateManager).LoadViewState(t.Second)
End If
If t.Third IsNot Nothing Then
CType(textBoxStyleValue, _
IStateManager).LoadViewState(t.Third)
End If
Else
Throw New ArgumentException("Invalid view state .")
End If
End If
End Sub
Protected Overrides Function SaveViewState() As Object
Dim baseState As Object = MyBase.SaveViewState
Dim buttonStyleState As Object = Nothing
Dim textBoxStyleState As Object = Nothing
If buttonStyleValue IsNot Nothing Then
buttonStyleState = CType(buttonStyleValue, _
IStateManager).SaveViewState
End If
If textBoxStyleValue IsNot Nothing Then
textBoxStyleState = CType(textBoxStyleValue, _
IStateManager).SaveViewState
End If
Return New Triplet(baseState, buttonStyleState, _
textBoxStyleState)
End Function
Protected Overrides Sub TrackViewState()
MyBase.TrackViewState()
If buttonStyleValue IsNot Nothing Then
CType(buttonStyleValue, IStateManager).TrackViewState()
End If
If textBoxStyleValue IsNot Nothing Then
CType(textBoxStyleValue, IStateManager).TrackViewState()
End If
End Sub
#End Region
End Class
End Namespace
// StyledRegister.cs
using System;
using System.ComponentModel;
using System.Drawing;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Samples.AspNet.CS.Controls
{
[
AspNetHostingPermission(SecurityAction.Demand,
Level = AspNetHostingPermissionLevel.Minimal),
AspNetHostingPermission(SecurityAction.InheritanceDemand,
Level=AspNetHostingPermissionLevel.Minimal),
DefaultEvent("Submit"),
DefaultProperty("ButtonText"),
ToolboxData(
"<{0}:StyledRegister runat=\"server\"> </{0}:StyledRegister>"),
]
public class StyledRegister : CompositeControl
{
private Button submitButton;
private TextBox nameTextBox;
private Label nameLabel;
private TextBox emailTextBox;
private Label emailLabel;
private RequiredFieldValidator _emailValidator;
private RequiredFieldValidator _nameValidator;
private Style _buttonStyle;
private Style _textBoxStyle;
private static readonly object EventSubmitKey = new object();
#region Properties delegated to child controls
[
Bindable(true),
Category("Appearance"),
DefaultValue(""),
Description("The text to display on the button.")
]
public string ButtonText
{
get
{
EnsureChildControls();
return submitButton.Text;
}
set
{
EnsureChildControls();
submitButton.Text = value;
}
}
[
Bindable(true),
Category("Default"),
DefaultValue(""),
Description("The user name.")
]
public string Name
{
get
{
EnsureChildControls();
return nameTextBox.Text;
}
set
{
EnsureChildControls();
nameTextBox.Text = value;
}
}
[
Bindable(true),
Category("Appearance"),
DefaultValue(""),
Description(
"The error message of the name validator.")
]
public string NameErrorMessage
{
get
{
EnsureChildControls();
return _nameValidator.ErrorMessage;
}
set
{
EnsureChildControls();
_nameValidator.ErrorMessage = value;
_nameValidator.ToolTip = value;
}
}
[
Bindable(true),
Category("Appearance"),
DefaultValue(""),
Description("The text for the name label.")
]
public string NameLabelText
{
get
{
EnsureChildControls();
return nameLabel.Text;
}
set
{
EnsureChildControls();
nameLabel.Text = value;
}
}
[
Bindable(true),
Category("Default"),
DefaultValue(""),
Description("The e-mail address.")
]
public string Email
{
get
{
EnsureChildControls();
return emailTextBox.Text;
}
set
{
EnsureChildControls();
emailTextBox.Text = value;
}
}
[
Bindable(true),
Category("Appearance"),
DefaultValue(""),
Description(
"Error message of the e-mail validator.")
]
public string EmailErrorMessage
{
get
{
EnsureChildControls();
return _emailValidator.ErrorMessage;
}
set
{
EnsureChildControls();
_emailValidator.ErrorMessage = value;
_emailValidator.ToolTip = value;
}
}
[
Bindable(true),
Category("Appearance"),
DefaultValue(""),
Description("The text for the e-mail label.")
]
public string EmailLabelText
{
get
{
EnsureChildControls();
return emailLabel.Text;
}
set
{
EnsureChildControls();
emailLabel.Text = value;
}
}
#endregion
#region Typed Style properties
[
Category("Styles"),
DefaultValue(null),
DesignerSerializationVisibility(
DesignerSerializationVisibility.Content),
PersistenceMode(PersistenceMode.InnerProperty),
Description(
"The strongly typed style for the Button child control.")
]
public virtual Style ButtonStyle
{
get
{
if (_buttonStyle == null)
{
_buttonStyle = new Style();
if (IsTrackingViewState)
{
((IStateManager)_buttonStyle).TrackViewState();
}
}
return _buttonStyle;
}
}
[
Category("Styles"),
DefaultValue(null),
DesignerSerializationVisibility(
DesignerSerializationVisibility.Content),
PersistenceMode(PersistenceMode.InnerProperty),
Description(
"The strongly typed style for the TextBox child control.")
]
public virtual Style TextBoxStyle
{
get
{
if (_textBoxStyle == null)
{
_textBoxStyle = new Style();
if (IsTrackingViewState)
{
((IStateManager)_textBoxStyle).TrackViewState();
}
}
return _textBoxStyle;
}
}
#endregion
#region Event definition
// The Submit event.
[
Category("Action"),
Description("Raised when the user clicks the button")
]
public event EventHandler Submit
{
add
{
Events.AddHandler(EventSubmitKey, value);
}
remove
{
Events.RemoveHandler(EventSubmitKey, value);
}
}
// The method that raises theSubmit event.
protected virtual void OnSubmit(EventArgs e)
{
EventHandler SubmitHandler =
(EventHandler)Events[EventSubmitKey];
if (SubmitHandler != null)
{
SubmitHandler(this, e);
}
}
// Handles the Click event of the Button and raises
// the Submit event.
private void _button_Click(object source, EventArgs e)
{
OnSubmit(EventArgs.Empty);
}
#endregion
#region Overridden methods
protected override void RecreateChildControls()
{
EnsureChildControls();
}
protected override void CreateChildControls()
{
Controls.Clear();
nameLabel = new Label();
nameTextBox = new TextBox();
nameTextBox.ID = "nameTextBox";
_nameValidator = new RequiredFieldValidator();
_nameValidator.ID = "validator1";
_nameValidator.ControlToValidate = nameTextBox.ID;
_nameValidator.Text = "*";
_nameValidator.Display = ValidatorDisplay.Static;
emailLabel = new Label();
emailTextBox = new TextBox();
emailTextBox.ID = "emailTextBox";
_emailValidator = new RequiredFieldValidator();
_emailValidator.ID = "validator2";
_emailValidator.ControlToValidate = emailTextBox.ID;
_emailValidator.Text = "*";
_emailValidator.Display = ValidatorDisplay.Static;
submitButton = new Button();
submitButton.ID = "button1";
submitButton.Click += new EventHandler(_button_Click);
this.Controls.Add(nameLabel);
this.Controls.Add(nameTextBox);
this.Controls.Add(_nameValidator);
this.Controls.Add(emailLabel);
this.Controls.Add(emailTextBox);
this.Controls.Add(_emailValidator);
this.Controls.Add(submitButton);
}
protected override void Render(HtmlTextWriter writer)
{
AddAttributesToRender(writer);
writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding,
"1", false);
writer.RenderBeginTag(HtmlTextWriterTag.Table);
if (_buttonStyle != null)
{
submitButton.ApplyStyle(ButtonStyle);
}
if (_textBoxStyle != null)
{
nameTextBox.ApplyStyle(TextBoxStyle);
emailTextBox.ApplyStyle(TextBoxStyle);
}
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
nameLabel.RenderControl(writer);
writer.RenderEndTag(); // Closing td.
writer.RenderBeginTag(HtmlTextWriterTag.Td);
nameTextBox.RenderControl(writer);
writer.RenderEndTag(); //Closing td.
writer.RenderBeginTag(HtmlTextWriterTag.Td);
_nameValidator.RenderControl(writer);
writer.RenderEndTag(); //Closing td.
writer.RenderEndTag(); //Closing tr.
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
emailLabel.RenderControl(writer);
writer.RenderEndTag(); //Closing td.
writer.RenderBeginTag(HtmlTextWriterTag.Td);
emailTextBox.RenderControl(writer);
writer.RenderEndTag(); //Closing td.
writer.RenderBeginTag(HtmlTextWriterTag.Td);
_emailValidator.RenderControl(writer);
writer.RenderEndTag(); //Closing td.
writer.RenderEndTag(); //Closing tr.
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.AddAttribute(HtmlTextWriterAttribute.Colspan,
"2", false);
writer.AddAttribute(HtmlTextWriterAttribute.Align,
"right", false);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
submitButton.RenderControl(writer);
writer.RenderEndTag(); //closing td.
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write(" ");
writer.RenderEndTag(); //closing td.
writer.RenderEndTag(); //closing tr.
writer.RenderEndTag(); //closing table.
}
#endregion
#region Custom state management
protected override void LoadViewState(object savedState)
{
if (savedState == null)
{
base.LoadViewState(null);
return;
}
else
{
Triplet t = savedState as Triplet;
if (t != null)
{
// Always invoke LoadViewState on the base class even if
// the saved state is null.
base.LoadViewState(t.First);
if ((t.Second) != null)
{
((IStateManager)ButtonStyle).LoadViewState(t.Second);
}
if ((t.Third) != null)
{
((IStateManager)TextBoxStyle).LoadViewState(t.Third);
}
}
else
{
throw new ArgumentException("Invalid view state .");
}
}
}
protected override object SaveViewState()
{
object baseState = base.SaveViewState();
object buttonStyleState = null;
object textBoxStyleState = null;
if (_buttonStyle != null)
{
buttonStyleState =
((IStateManager)_buttonStyle).SaveViewState();
}
if (_textBoxStyle != null)
{
textBoxStyleState =
((IStateManager)_textBoxStyle).SaveViewState();
}
return new Triplet(baseState,
buttonStyleState, textBoxStyleState);
}
protected override void TrackViewState()
{
base.TrackViewState();
if (_buttonStyle != null)
{
((IStateManager)_buttonStyle).TrackViewState();
}
if (_textBoxStyle != null)
{
((IStateManager)_textBoxStyle).TrackViewState();
}
}
#endregion
}
}
Illustrazione del codice
Il controllo StyledRegister illustra i seguenti passaggi principali dell'implementazione di stili tipizzati per i controlli figlio:
Definizione delle proprietà di tipo Style o di tipi derivati da Style.
Implementazione della gestione dello stato per le proprietà dello stile.
Applicazione di stili ai controlli figlio.
Poiché il tipo Style implementa l'interfaccia IStateManager, il modello per la definizione di una proprietà di tipo Style è identico a quello descritto in Esempio di gestione dello stato delle proprietà personalizzate. La proprietà dello stile tipizzato viene definita come proprietà in sola lettura memorizzata in un campo privato. Nella funzione di accesso della proprietà, una nuova istanza di Style viene creata solo se il campo corrispondente alla proprietà è null (Nothing in Visual Basic). Se il controllo ha avviato il monitoraggio dello stato, viene chiamato il metodo TrackViewState dell'istanza appena creata di Style. Le proprietà ButtonStyle e TextBoxStyle di StyledRegister vengono definite utilizzando questa tecnica.
Analogamente, l'implementazione dei metodi di gestione dello stato in StyledRegister è uguale all'implementazione descritta in Esempio di gestione dello stato delle proprietà personalizzate. Nel metodo TrackViewState del controllo, sottoposto a override, vengono chiamati il metodo TrackViewState sulla classe base e il metodo TrackViewState su ogni proprietà dello stile. Nel metodo SaveViewState del controllo, sottoposto a override, vengono chiamati i metodi SaveViewState sulla classe base e SaveViewState su ogni proprietà di stile. Lo stato restituito da SaveViewState rappresenta lo stato combinato della classe base e delle proprietà di stile. Per facilitare il recupero nel metodo LoadViewState, il controllo StyledRegister utilizza un oggetto Triplet per salvare lo stato combinato. Il metodo LoadViewState esegue l'inversione del metodo SaveViewState e carica lo stato nella classe base e negli stili tipizzati del postback.
L'ultimo passaggio dell'implementazione di uno stile tipizzato è l'applicazione degli stili ai controlli figlio. Il controllo StyledRegister esegue questo passaggio durante il rendering, in seguito al salvataggio dello stato di visualizzazione; pertanto, lo stato che corrisponde agli stili tipizzati non viene salvato nello stato di visualizzazione dei controlli figlio. Se ai controlli figlio venissero applicati gli stili tipizzati quando il monitoraggio dello stato è attivo, gli stili verrebbero salvati nello stato di visualizzazione dei controlli figlio. Non si tratterebbe tuttavia di un'operazione efficace, poiché le proprietà degli stili tipizzati gestiscono il proprio stato. La seguente porzione di codice tratta dal metodo Render del controllo StyledRegister mostra il modello di implementazione per l'applicazione degli stili durante la fase di esecuzione del rendering:
protected override void Render(HtmlTextWriter writer)
{
// Add code here to set up rendering.
if (_buttonStyle != null)
{
_button.ApplyStyle(ButtonStyle);
}
if (_textBoxStyle != null)
{
_nameTextBox.ApplyStyle(TextBoxStyle);
_emailTextBox.ApplyStyle(TextBoxStyle);
}
// Add code here to continue rendering.
}
Protected Overrides Sub Render(ByVal writer As HtmlTextWriter)
' Add code here to set up rendering.
If buttonStyleValue IsNot Nothing Then
submitButton.ApplyStyle(buttonStyleValue)
End If
If textBoxStyleValue IsNot Nothing Then
nameTextBox.ApplyStyle(textBoxStyleValue)
emailTextBox.ApplyStyle(textBoxStyleValue)
End If
' Add code here to continue rendering.
End Sub
Pagina di test per il controllo StyledRegister
Il seguente esempio mostra una pagina aspx che utilizza il controllo StyledRegister. Nel gestore eventi Submit, è necessario aggiungere codice per inserire i dati di registrazione nel database o per scrivere un cookie nel computer dell'utente. In un'applicazione di produzione, è anche necessario verificare che non ci siano attacchi intrusivi nel codice. Per ulteriori informazioni, vedere Cenni preliminari sugli attacchi tramite script.
<%@ Page Language="VB"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >
Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
Label1.Visible = False
End Sub
Sub StyledRegister_Submit(ByVal sender As Object, _
ByVal e As EventArgs)
Label1.Text = String.Format( _
"Thank you, {0}! You are registered.", _
StyledRegister1.Name)
Label1.Visible = True
StyledRegister1.Visible = False
End Sub
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" >
<title>
StyledRegister Control Test Page
</title>
</head>
<body>
<form id="form1" >
<aspSample:StyledRegister ButtonText="Register"
OnSubmit="StyledRegister_Submit" ID="StyledRegister1"
Runat="server" NameLabelText="Name:" EmailLabelText="Email:"
EmailErrorMessage="You must enter your e-mail address."
NameErrorMessage="You must enter your name."
BorderStyle="Solid" BorderWidth="1px" BackColor="#E0E0E0">
<TextBoxStyle Font-Names="Arial" BorderStyle="Solid"
ForeColor="#804000"></TextBoxStyle>
<ButtonStyle Font-Names="Arial" BorderStyle="Outset"
BackColor="Silver"></ButtonStyle>
</aspSample:StyledRegister>
<br />
<asp:Label ID="Label1" Runat="server" Text="Label">
</asp:Label>
<asp:ValidationSummary ID="ValidationSummary1"
Runat="server" DisplayMode="List" />
</form>
</body>
</html>
<%@ Page Language="C#"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >
void Page_Load(object sender, EventArgs e)
{
Label1.Visible = false;
}
void StyledRegister_Submit(object sender, EventArgs e)
{
Label1.Text = String.Format("Thank you, {0}! You are registered.",
StyledRegister1.Name);
Label1.Visible = true;
StyledRegister1.Visible = false;
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" >
<title>
StyledRegister Control Test Page
</title>
</head>
<body>
<form id="form1" >
<aspSample:StyledRegister ButtonText="Register"
OnSubmit="StyledRegister_Submit" ID="StyledRegister1"
Runat="server" NameLabelText="Name:" EmailLabelText="Email:"
EmailErrorMessage="You must enter your e-mail address."
NameErrorMessage="You must enter your name."
BorderStyle="Solid" BorderWidth="1px" BackColor="#E0E0E0">
<TextBoxStyle Font-Names="Arial" BorderStyle="Solid"
ForeColor="#804000"></TextBoxStyle>
<ButtonStyle Font-Names="Arial" BorderStyle="Outset"
BackColor="Silver"></ButtonStyle>
</aspSample:StyledRegister>
<br />
<asp:Label ID="Label1" Runat="server" Text="Label">
</asp:Label>
<asp:ValidationSummary ID="ValidationSummary1"
Runat="server" DisplayMode="List" />
</form>
</body>
</html>
Creazione e utilizzo dell'esempio
Per informazioni sulla compilazione e sull'utilizzo degli esempi di controlli personalizzati, vedere Generazione degli esempi dei controlli server personalizzati.
Vedere anche
Concetti
Esempio di controllo Web composito
Esempio di gestione dello stato delle proprietà personalizzate