子コントロールの型指定されたスタイルの例
更新 : 2007 年 11 月
この例では、厳密に型指定されたスタイルのプロパティを複合コントロールに実装する StyledRegister というコントロールを作成する方法を示します。これらのプロパティによって、複合コントロールの子コントロールの外観をカスタマイズできます。型指定されたスタイルによって、複合コントロールを容易にスケーリングできます。複合コントロールに追加する子コントロールの数が増加するにつれて、複合コントロールの各子コントロールの多くのプロパティを公開して管理するのが困難になります。その代わりに、多くのプロパティを単一のスタイル プロパティにカプセル化します。
この例の StyledRegister コントロールは、「複合 Web コントロールの例」で説明されている Register コントロールに似ています。StyledRegister コントロールには 2 つの TextBox 子コントロールと 1 つの Button 子コントロールがあります。StyledRegister クラスは ButtonStyle プロパティと TextBoxStyle プロパティを公開し、TextBox 子コントロールと Button 子コントロールに Font、ForeColor およびその他のスタイルに関連するプロパティを設定できるようにします。
ページの開発者は、次の例のように、StyledRegister コントロールのコントロールに Font-Names、ForeColor、および BackColor の各プロパティを設定できます。
<aspSample:StyledRegister ID="StyledRegister1" runat="server">
<TextBoxStyle Font-Names="Arial" BorderStyle="Solid"
ForeColor="#804000"></TextBoxStyle>
<ButtonStyle Font-Names="Arial" BorderStyle="Outset"
BackColor="Silver"></ButtonStyle>
</aspSample:StyledRegister>
前の例のように、型指定されたスタイルのプロパティは、コントロールのタグ内に子要素として永続化されます。この方法で永続化されるプロパティの実装については、「サーバー コントロールのプロパティの例」の Author プロパティの実装を参照してください。
型指定されたスタイルは Style 型または Style から派生する型のプロパティです。Style クラスは、Font、ForeColor、BackColor などの表示に関するプロパティを公開します。WebControl クラスの ControlStyle プロパティは Style 型です。Web コントロールの Font、ForeColor、および BackColor の各プロパティは WebControl クラスのトップ レベルのプロパティとしても公開されますが、ControlStyle プロパティのサブプロパティです。
Style クラスにはサブプロパティがあるため、Style 型のプロパティには「カスタム プロパティの状態管理の例」に説明されているカスタム状態管理が必要です。型指定されたスタイルの実装の詳細については、この後の「コードの説明」で説明します。
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
}
}
コードの説明
StyledRegister コントロールには、子コントロールの型指定されたスタイルの実装に関する次の主要な手順が含まれます。
Style 型は IStateManager インターフェイスを実装するため、Style 型のプロパティを定義するパターンは「カスタム プロパティの状態管理の例」に説明されているパターンと同じです。型指定されたスタイル プロパティは、プライベート フィールドに格納された読み取り専用プロパティとして定義します。プロパティのアクセサで、プロパティに対応するフィールドが null (Visual Basic では Nothing) の場合のみ Style インスタンスを新規作成します。コントロールが状態追跡を開始している場合は、新規作成された Style インスタンスの TrackViewState メソッドを呼び出します。StyledRegister の ButtonStyle プロパティと TextBoxStyle プロパティは、このテクニックを使用して定義されます。
StyledRegister の状態管理のメソッドの実装も「カスタム プロパティの状態管理の例」で説明されている実装と同じです。オーバーライドされたコントロールの TrackViewState メソッドで、基本クラスに対して TrackViewState メソッドを呼び出し、各スタイル プロパティに対して TrackViewState メソッドを呼び出します。オーバーライドされたコントロールの SaveViewState メソッドで、基本クラスに対して SaveViewState メソッドを呼び出し、各スタイル プロパティに対して SaveViewState メソッドを呼び出します。SaveViewState が返す状態は、基本クラスとスタイル プロパティを組み合わせた状態を表します。LoadViewState メソッドで状態を簡単に取得するために、StyledRegister コントロールは Triplet オブジェクトを使用して状態の組み合わせを保存します。LoadViewState メソッドは SaveViewState メソッドの逆の操作を実行し、ポストバック時に基本クラスと型指定されたスタイルに状態を読み込みます。
型指定されたスタイルの実装の最後の手順は、子コントロールにスタイルを適用することです。StyledRegister コントロールは、型指定されたスタイルに対応する状態が子コントロールのビューステートに保存されないように、この手順をレンダリングの段階のビューステートが保存された後に実行します。状態追跡が有効になっている場合に型指定されたスタイルを子コントロールに適用すると、スタイルは子コントロールのビューステートに保存されます。型指定されたスタイル プロパティは各自で状態を管理するため、これは効率的ではありません。StyledRegister コントロールの Render メソッドから抜粋した次のコードは、レンダリングの段階にスタイルを適用する実装パターンを示します。
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
StyledRegister コントロールのテスト ページ
StyledRegister コントロールを使用する .aspx ページの例を次に示します。Submit イベント ハンドラで、データベースに登録データを入力するか、またはユーザーのコンピュータに Cookie を書き込むコードを追加します。実際のアプリケーションでは、スクリプト注入攻撃のチェックも実行する必要があります。詳細については、「スクリプトによる攻略の概要」を参照してください。
<%@ Page Language="VB"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
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" runat="server">
<title>
StyledRegister Control Test Page
</title>
</head>
<body>
<form id="form1" runat="server">
<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 runat="server">
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" runat="server">
<title>
StyledRegister Control Test Page
</title>
</head>
<body>
<form id="form1" runat="server">
<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>
例のビルドと使用
カスタム コントロールの例のコンパイルと使用については、「カスタム サーバー コントロールの例のビルド」を参照してください。