ControlBuilder クラス
コントロールとその子コントロールを作成するときにページ パーサーをサポートします。
この型のすべてのメンバの一覧については、ControlBuilder メンバ を参照してください。
System.Object
System.Web.UI.ControlBuilder
派生クラス
Public Class ControlBuilder
[C#]
public class ControlBuilder
[C++]
public __gc class ControlBuilder
[JScript]
public class ControlBuilder
スレッドセーフ
この型の public static (Visual Basicでは Shared) のすべてのメンバは、マルチスレッド操作で安全に使用できます。インスタンスのメンバの場合は、スレッドセーフであるとは限りません。
解説
既定では、ページ上のすべてのコントロールが既定の ControlBuilder クラスに関連付けられます。このクラスは、カスタム コントロール タグ内にあるすべての入れ子のコントロールを格納する Controls コレクションに子コントロールを追加します。また、このクラスは、入れ子のコントロール タグの間にあるテキストのリテラル コントロールを作成します。独自のカスタム コントロール ビルダ クラスを定義して、この既定の動作をオーバーライドできます。既定の動作をオーバーライドするには、次のようにして、作成したコントロール ビルダ クラスに ControlBuilderAttribute を適用します。 [ControlBuilderAttribute(typeof(ControlBuilderType))]
使用例
[Visual Basic, C#, C++] テーブルの作成時に属性と内容が定義される Table コントロールを作成する例を次に示します。実行可能ファイルを作成するために使用するコマンド ラインを次に示します。
vbc /r:System.dll /r:System.Web.dll /r:System.Drawing.dll /t:library /out:myWebAppPath/bin/vb_mycontrolbuilder.dll myControlBuilder.vb
csc /t:library /out:myWebAppPath/bin/cs_mycontrolbuilder.dll myControlBuilder.cs
'File name myControlBuilder.vb.
Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Collections
Imports System.Drawing
Namespace CustomControls
_
Public Class MyCellVB
Inherits Control
Implements INamingContainer
' Class Name: MyCellVB.
' Declares the class for the child controls to be included in the control collection.
Private _id As String
Private _value As String
Private _backColor As Color
Public Property CellID() As String
Get
Return _id
End Get
Set
_id = value
End Set
End Property
Public Property Text() As String
Get
Return _value
End Get
Set
_value = value
End Set
End Property
Public Property BackColor() As Color
Get
Return _backColor
End Get
Set
_backColor = value
End Set
End Property
End Class 'MyCellVB
_
Public Class MyControlBuilderVB
Inherits ControlBuilder
<System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> _
Public Overrides Function GetChildControlType(tagName As String, attribs As IDictionary) As Type
' Allows TableRow without "runat=server" attribute to be added to the collection.
If tagName.ToLower().EndsWith("mycellvb") Then
Return GetType(MyCellVB)
End If
Return Nothing
End Function 'GetChildControlType
' Ignores literals between rows.
<System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> _
Public Overrides Sub AppendLiteralString(s As String)
End Sub 'AppendLiteralString
End Class 'MyControlBuilderVB
<ControlBuilderAttribute(GetType(MyControlBuilderVB))> _
Public Class MyVB_CustomControl
Inherits Control
Implements INamingContainer
' Class name: MyVB_CustomControl.
' Processes the element declarations within a control
' declaration. This builds the actual control.
' Custom control to build programmatically.
Private _table As Table
Private _cellObjects As New Hashtable()
' Variables that must contain the control attributes as defined in the Web page.
Private _rows As Integer
Private _columns As Integer
Private _title As String
' Rows property to be used as the attribute name in the Web page.
Public Property Rows () As String
Get
Return _rows
End Get
Set
_rows = CInt(value)
End Set
End Property
' Columns property to be used as the attribute name in the Web page.
Public Property Columns () As String
Get
Return _columns
End Get
Set
_columns = CInt(value)
End Set
End Property
' Title property to be used as the attribute name in the Web page
Public Property Title() As String
Get
Return _title
End Get
Set
_title = value
End Set
End Property
Protected Sub createNewRow(rowNumber As Integer)
' Creates a row and adds it to the table.
Dim row As TableRow
row = New TableRow()
_table.Rows.Add(row)
' Creates a cell that contains text.
Dim y As Integer
For y = 0 To Columns - 1
appendCell(row, rowNumber, y)
Next y
End Sub 'createNewRow
Protected Sub appendCell(row As TableRow, rowNumber As Integer, cellNumber As Integer)
Dim cell As TableCell
Dim textbox As TextBox
cell = New TableCell()
textbox = New TextBox()
cell.Controls.Add(textbox)
textbox.ID = "r" + rowNumber.ToString() + "c" + cellNumber.ToString()
' Checks for the MyCellVB child object.
If Not (_cellObjects(textbox.ID) Is Nothing) Then
Dim cellLookup As MyCellVB
cellLookup = CType(_cellObjects(textbox.ID), MyCellVB)
textbox.Text = cellLookup.Text
textbox.BackColor = cellLookup.BackColor
Else
textbox.Text = "Row: " + rowNumber.ToString() + " Cell: " + cellNumber.ToString()
End If
row.Cells.Add(cell)
End Sub 'appendCell
' Called at runtime when a child object is added to the collection.
<System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> _
Protected Overrides Sub AddParsedSubObject(obj As Object)
If TypeOf obj Is MyCellVB Then
Dim cell As MyCellVB
cell = CType(obj, MyCellVB)
Context.Trace.Write("CellObject", cell.CellID)
_cellObjects.Add(cell.CellID, cell)
Return
End If
End Sub 'AddParsedSubObject
<System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> _
Protected Overrides Sub OnPreRender(e As EventArgs)
' Sub name: OnPreRender.
' Carries out changes affecting the control state and renders the resulting UI.
' Increases the number of rows if needed.
While _table.Rows.Count < Rows
createNewRow(_table.Rows.Count)
End While
' Checks that each row has the correct number of columns.
Dim i As Integer
For i = 0 To _table.Rows.Count - 1
While _table.Rows(i).Cells.Count < Columns
appendCell(_table.Rows(i), i, _table.Rows(i).Cells.Count)
End While
While _table.Rows(i).Cells.Count > Columns
_table.Rows(i).Cells.RemoveAt((_table.Rows(i).Cells.Count - 1))
End While
Next i
End Sub 'OnPreRender
<System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> _
Protected Overrides Sub CreateChildControls()
' Sub name: CreateChildControls.
' Adds the Table and the text controls to the control collection.
Dim [text] As LiteralControl
' Initializes the text control using the Title property.
[text] = New LiteralControl("<h5>" + Title + "</h5>")
Controls.Add([text])
_table = New Table()
Controls.Add(_table)
End Sub 'CreateChildControls
End Class 'MyVB_CustomControl
End Namespace 'CustomControls
[C#]
/* File name: myControlBuilder.cs. */
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Collections;
using System.Drawing;
namespace CustomControls
{
public class MyTableCell : TableCell, INamingContainer {};
public class MyCell
/*
* Class name: MyCell.
* Declares the class for the child controls to include in the control collection.
*/
{
string _id;
string _value;
Color _backColor;
public string CellID
{
get
{return _id;}
set
{_id = value;}
}
public string Text
{
get
{return _value;}
set
{_value = value;}
}
public Color BackColor
{
get
{return _backColor;}
set
{ _backColor = value;}
}
};
public class MyControlBuilder : ControlBuilder
{
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]
public override Type GetChildControlType(string tagName, IDictionary attribs)
{
// Allows TableRow without "runat=server" attribute to be added to the collection.
if (tagName.ToLower().EndsWith("mycell"))
return typeof(MyCell);
return null;
}
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]
public override void AppendLiteralString(string s)
{
// Ignores literals between rows.
}
}
[ControlBuilderAttribute(typeof(MyControlBuilder))]
public class MyCS_CustomControl: Control, INamingContainer
/*
* Class name: MyCS_CustomControl.
* Processes the element declarations within a control declaration.
* This builds the actual control.
*/
{
// Declares the custom control that must be built programmatically.
Table _table;
private String _title;
private int _rows;
private int _columns;
Hashtable _cellObjects = new Hashtable();
// Rows property to be used as the attribute name in the Web page.
public int Rows
{
get
{return _rows;}
set
{_rows = value;}
}
// Columns property to be used as the attribute name in the Web page.
public int Columns
{
get
{return _columns;}
set
{_columns = value;}
}
// Title property to be used as the attribute name in the Web page.
public string Title
{
get
{return _title;}
set
{_title = value;}
}
protected void createNewRow( int rowNumber )
{
// Creates a row and adds it to the table.
TableRow row;
row = new TableRow();
_table.Rows.Add( row );
// Creates a cell that contains text.
for( int y=0; y < Columns ; y++ )
appendCell( row, rowNumber, y );
}
protected void appendCell( TableRow row, int rowNumber, int cellNumber )
{
TableCell cell;
TextBox textbox;
cell = new TableCell();
textbox = new TextBox();
cell.Controls.Add( textbox );
textbox.ID = "r" + rowNumber.ToString() + "c" + cellNumber.ToString();
// Checks for the MyCell child object.
if ( _cellObjects[textbox.ID] != null )
{
MyCell cellLookup;
cellLookup = (MyCell) _cellObjects[textbox.ID];
textbox.Text = cellLookup.Text;
textbox.BackColor = cellLookup.BackColor;
}
else
textbox.Text = "Row: " + rowNumber.ToString() + " Cell: " +
cellNumber.ToString();
row.Cells.Add( cell );
}
// Called at runtime when a child object is added to the collection.
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]
protected override void AddParsedSubObject(object obj)
{
MyCell cell = obj as MyCell;
if (cell != null)
{
_cellObjects.Add( cell.CellID, cell );
}
}
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]
protected override void OnPreRender(EventArgs e)
/*
* Function name: OnPreRender.
* Carries out changes affecting the control state and renders the resulting UI.
*/
{
// Increases the number of rows if needed.
while (_table.Rows.Count < Rows)
{
createNewRow(_table.Rows.Count );
}
// Checks that each row has the correct number of columns.
for (int i=0; i<_table.Rows.Count; i++)
{
while(_table.Rows[i].Cells.Count<Columns)
{
appendCell(_table.Rows[i], i, _table.Rows[i].Cells.Count);
}
while(_table.Rows[i].Cells.Count>Columns)
{
_table.Rows[i].Cells.RemoveAt(_table.Rows[i].Cells.Count - 1);
}
}
}
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]
protected override void CreateChildControls()
/*
* Function name: CreateChildControls.
* Adds the Table and the text control to the control collection.
*/
{
LiteralControl text;
// Initializes the text control using the Title property.
text = new LiteralControl("<h5>" + Title + "</h5>");
Controls.Add(text);
_table = new Table();
_table.BorderWidth = 2;
Controls.Add(_table);
}
}
}
[C++]
/* File name: myControlBuilder.cpp. */
#using <mscorlib.dll>
#using <System.Web.dll>
#using <System.dll>
#using <System.Drawing.dll>
using namespace System;
using namespace System::Web;
using namespace System::Web::UI;
using namespace System::Web::UI::WebControls;
using namespace System::Collections;
using namespace System::Drawing;
public __gc class MyTableCell : public TableCell, public INamingContainer
{
};
public __gc class MyCell
{
/*
* Class name: MyCell.
* Declares the class for the child controls to include in the control collection.
*/
String* _id;
String* _value;
Color _backColor;
public:
__property String* get_CellID()
{
return _id;
}
__property void set_CellID(String* value)
{
_id = value;
}
__property String* get_Text()
{
return _value;
}
__property void set_Text(String* value)
{
_value = value;
}
__property Color get_BackColor()
{
return _backColor;
}
__property void set_BackColor(Color value)
{
_backColor = value;
}
};
public __gc class MyControlBuilder : public ControlBuilder
{
public:
[System::Security::Permissions::PermissionSet(System::Security::Permissions::SecurityAction::Demand, Name="FullTrust")]
Type * GetChildControlType(String* tagName, IDictionary* attribs)
{
// Allows TableRow without "runat=server" attribute to be added to the collection.
if (tagName->ToLower()->EndsWith(S"mycell"))
return __typeof(MyCell);
return 0;
}
[System::Security::Permissions::PermissionSet(System::Security::Permissions::SecurityAction::Demand, Name="FullTrust")]
void AppendLiteralString(String* s)
{
// Ignores literals between rows.
}
};
[ControlBuilderAttribute(__typeof(MyControlBuilder))]
public __gc class MyCS_CustomControl: public Control, public INamingContainer
{
/*
* Class name: MyCS_CustomControl.
* Processes the element declarations within a control declaration.
* This builds the actual control.
*/
// Declares the custom control that must be built programmatically.
Table* _table;
private:
String* _title;
int _rows;
int _columns;
Hashtable* _cellObjects;
// Rows property to be used as the attribute name in the Web page.
public:
MyCS_CustomControl()
{
_cellObjects = new Hashtable();
}
__property int get_Rows()
{
return _rows;
}
__property void set_Rows(int value)
{
_rows = value;
}
// Columns property to be used as the attribute name in the Web page.
__property int get_Columns()
{
return _columns;
}
__property void set_Columns(int value)
{
_columns = value;
}
// Title property to be used as the attribute name in the Web page.
__property String* get_Title()
{
return _title;
}
__property void set_Title(String* value)
{
_title = value;
}
protected:
void createNewRow(int rowNumber)
{
// Creates a row and adds it to the table.
TableRow * row;
row = new TableRow();
_table->Rows->Add(row);
// Creates a cell that contains text.
for (int y = 0; y < Columns ; y++)
appendCell(row, rowNumber, y);
}
void appendCell(TableRow* row, int rowNumber, int cellNumber)
{
TableCell * cell;
TextBox * textbox;
cell = new TableCell();
textbox = new TextBox();
cell->Controls->Add(textbox);
textbox->ID = String::Concat(S"r", __box(rowNumber), S"c", __box(cellNumber));
// Checks for the MyCell child object.
if (_cellObjects->Item[textbox->ID] != 0)
{
MyCell * cellLookup;
cellLookup = dynamic_cast<MyCell*>(_cellObjects->Item[textbox->ID]);
textbox->Text = cellLookup->Text;
textbox->BackColor = cellLookup->BackColor;
}
else
textbox->Text = String::Concat(S"Row: ", __box(rowNumber), S"Cell: ", __box(cellNumber));
row->Cells->Add(cell);
}
// Called at runtime when a child object is added to the collection.
[System::Security::Permissions::PermissionSet(System::Security::Permissions::SecurityAction::Demand, Name="FullTrust")]
void AddParsedSubObject(Object* obj)
{
MyCell * cell = dynamic_cast<MyCell*>(obj);
if (cell != 0)
_cellObjects->Add(cell->CellID, cell);
}
[System::Security::Permissions::PermissionSet(System::Security::Permissions::SecurityAction::Demand, Name="FullTrust")]
void OnPreRender(EventArgs* e)
{
/*
* Function name: OnPreRender.
* Carries out changes affecting the control state and renders the resulting UI.
*/
// Increases the number of rows if needed.
while (_table->Rows->Count < Rows)
createNewRow(_table->Rows->Count);
// Checks that each row has the correct number of columns.
for (int i=0; i<_table->Rows->Count; i++)
while(_table->Rows->Item[i]->Cells->Count<Columns)
appendCell(_table->Rows->Item[i], i, _table->Rows->Item[i]->Cells->Count);
while(_table->Rows->Item[i]->Cells->Count>Columns)
_table->Rows->Item[i]->Cells->RemoveAt(_table->Rows->Item[i]->Cells->Count - 1);
}
[System::Security::Permissions::PermissionSet(System::Security::Permissions::SecurityAction::Demand, Name="FullTrust")]
void CreateChildControls()
{
/*
* Function name: CreateChildControls.
* Adds the Table and the text control to the control collection.
*/
LiteralControl * text;
// Initializes the text control using the Title property.
text = new LiteralControl(String::Concat(S"<h5>",Title,S"</h5>"));
Controls->Add(text);
_table = new Table();
_table->BorderWidth = 2;
Controls->Add(_table);
}
};
[Visual Basic, C#, C++] 前述のカスタム コントロールを使用する例を次に示します。特に、この例では、実行時に属性と内容が定義されるテーブルを作成します。Register ディレクティブに示される値には、前のコマンド ラインが反映されます。
<%@ Register TagPrefix="custom" Assembly="vb_mycontrolbuilder" Namespace="CustomControls" %>
<html>
<body>
<h4>Using the ControlBuilder Class</h4>
<form runat="server">
<custom:MyVB_CustomControl Rows="2" Columns="2" Title="VB Custom Control Table" runat="server">
<custom:MyCellVB CellID="r0c0" BackColor="magenta" Text="Hello"/>
<custom:MyCellVB CellID="r0c1" BackColor="aqua" Text="Customer,"/>
<custom:MyCellVB CellID="r1c0" BackColor="yellow" Text="How Are"/>
<custom:MyCellVB CellID="r1c1" BackColor="red" Text="You?"/>
</custom:MyVB_CustomControl>
</form>
</body>
</html>
[C#]
<%@ Register TagPrefix="custom" Assembly="cs_mycontrolbuilder" Namespace="CustomControls" %>
<html>
<body>
<h4>Using the ControlBuilder Class</h4>
<form runat="server">
<custom:MyCS_CustomControl ID="csTableId" rows="2" columns="2" Title="C# Custom Control Table" runat=server>
<custom:MyCell CellID="r0c0" BackColor="red" Text="Hello"/>
<custom:MyCell CellID="r0c1" BackColor="yellow" Text="Customer,"/>
<custom:MyCell CellID="r1c0" BackColor="aqua" Text="How Are"/>
<custom:MyCell CellID="r1c1" BackColor="magenta" Text="You?"/>
</custom:MyCS_CustomControl>
</form>
</body>
</html>
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
名前空間: System.Web.UI
プラットフォーム: Windows 2000, Windows XP Professional, Windows Server 2003 ファミリ
アセンブリ: System.Web (System.Web.dll 内)
参照
ControlBuilder メンバ | System.Web.UI 名前空間 | Control | Page | ControlBuilderAttribute