ControlBuilder クラス
アセンブリ: System.Web (system.web.dll 内)


既定では、ページ上のすべてのコントロールが既定の ControlBuilder クラスに関連付けられます。解析中、ASP.NET ページ フレームワークは、ページに対して、コントロールのツリーに対応する ControlBuilder オブジェクトのツリーを構築します。ControlBuilder ツリーを使用して、コントロール ツリーを作成するページ コードが生成されます。子コントロールに加えて、ControlBuilder は、コントロール タグ内の内容をどのように解析するかについても定義します。独自のカスタム コントロール ビルダ クラスを定義して、この既定の動作をオーバーライドできます。既定の動作をオーバーライドするには、次のようにして、作成したコントロール ビルダ クラスにControlBuilderAttribute 属性を適用します。
[ControlBuilderAttribute(typeof(ControlBuilderType))]

テーブルの作成時に属性と内容が定義される Table コントロールを作成するコード例を次に示します。実行可能ファイルを作成するために使用するコマンド ラインを次に示します。
vbc /r:System.dll /r:System.Web.dll /r:System.Drawing.dll /t:library /out:myWebAppPath/Bin/vb_mycontrolbuilder.dll myControlBuilder.vb
[C#]
Imports System Imports System.Web Imports System.Web.UI Imports System.Web.UI.WebControls Imports System.Collections Imports System.Drawing Imports System.Security.Permissions Namespace CustomControls <AspNetHostingPermission(SecurityAction.Demand, Level:=AspNetHostingPermissionLevel.Minimal)> _ Public Class MyTableCell Inherits TableCell Implements INamingContainer End Class <AspNetHostingPermission(SecurityAction.Demand, Level:=AspNetHostingPermissionLevel.Minimal)> _ Public Class MyCell Inherits Control Implements INamingContainer ' Class Name: MyCell. ' 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(ByVal value As String) _id = value End Set End Property Public Property Text() As String Get Return _value End Get Set(ByVal value As String) _value = value End Set End Property Public Property BackColor() As Color Get Return _backColor End Get Set(ByVal value As Color) _backColor = value End Set End Property End Class <AspNetHostingPermission(SecurityAction.Demand, Level:=AspNetHostingPermissionLevel.Minimal)> _ Public Class MyControlBuilderVB Inherits ControlBuilder Public Overrides Function GetChildControlType(ByVal tagName As String, ByVal attribs As IDictionary) As Type ' Allows TableRow without "runat=server" attribute to be added to the collection. If (String.Compare(tagName, "mycell", True) = 0) Then Return GetType(MyCell) End If Return Nothing End Function ' Ignores literals between rows. Public Overrides Sub AppendLiteralString(ByVal s As String) ' Ignores literals between rows. End Sub End Class <AspNetHostingPermission(SecurityAction.Demand, Level:=AspNetHostingPermissionLevel.Minimal), 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 Integer Get Return _rows End Get Set(ByVal value As Integer) _rows = value End Set End Property ' Columns property to be used as the attribute name in the Web page. Public Property Columns() As Integer Get Return _columns End Get Set(ByVal value As Integer) _columns = 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(ByVal value As String) _title = value End Set End Property Protected Sub createNewRow(ByVal 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(ByVal row As TableRow, ByVal rowNumber As Integer, ByVal 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 MyCell child object. If Not (_cellObjects(textbox.ID) Is Nothing) Then Dim cellLookup As MyCell cellLookup = CType(_cellObjects(textbox.ID), MyCell) 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. Protected Overrides Sub AddParsedSubObject(ByVal obj As Object) Dim cell As MyCell = CType(obj, MyCell) If Not (cell Is Nothing) Then _cellObjects.Add(cell.CellID, cell) End If End Sub 'AddParsedSubObject Protected Overrides Sub OnPreRender(ByVal 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 End Class End Namespace
using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Collections; using System.Drawing; using System.Security.Permissions; namespace CustomControls { [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)] public class MyTableCell : TableCell, INamingContainer { }; [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)] 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; } } }; [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)] public class MyControlBuilder : ControlBuilder { public override Type GetChildControlType(string tagName, IDictionary attribs) { // Allows TableRow without "runat=server" attribute to be added to the collection. if (String.Compare(tagName, "mycell", true) == 0) return typeof(MyCell); return null; } public override void AppendLiteralString(string s) { // Ignores literals between rows. } } [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)] [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. protected override void AddParsedSubObject(object obj) { MyCell cell = obj as MyCell; if (cell != null) { _cellObjects.Add(cell.CellID, cell); } } 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); } } } 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); } } }
package CustomControls; import System.*; import System.Web.*; import System.Web.UI.*; import System.Web.UI.WebControls.*; import System.Collections.*; import System.Drawing.*; import System.Security.Permissions.*; /** @attribute AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] */ public class MyTableCell extends TableCell implements INamingContainer { } /** @attribute AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] */ public class MyCell { /* Class name: MyCell. Declares the class for the child controls to include in the control collection. */ private String _id; private String _value; private Color _backColor; /** @property */ public String get_CellID() { return _id; } //get_CellID /** @property */ public void set_CellID(String value) { _id = value; } //set_CellID /** @property */ public String get_Text() { return _value; } //get_Text /** @property */ public void set_Text(String value) { _value = value; } //set_Text /** @property */ public Color get_BackColor() { return _backColor; } //get_BackColor /** @property */ public void set_BackColor(Color value) { _backColor = value; } //set_BackColor } //MyCell /** @attribute AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] */ public class MyControlBuilder extends ControlBuilder { public Type GetChildControlType(String tagName, IDictionary attribs) { // Allows TableRow without "runat=server" attribute to be added // to the collection. if (String.Compare(tagName, "mycell", true) == 0) { return MyCell.class.ToType(); } return null; } public void AppendLiteralString(String s) { // Ignores literals between rows. } } /** @attribute ControlBuilderAttribute(MyControlBuilder.class) */ /** @attribute AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] */ public class MyJSL_CustomControl extends Control implements INamingContainer { /* Class name: MyJSL_CustomControl. Processes the element declarations within a control declaration. This builds the actual control. */ // Declares the custom control that must be built programmatically. private Table _table; private String _title; private int _rows; private int _columns; private Hashtable _cellObjects = new Hashtable(); // Rows property to be used as the attribute name in the Web page. /** @property */ public int get_Rows() { return _rows; } /** @property */ public void set_Rows(int value) { _rows = value; } // Columns property to be used as the attribute name in the Web page. /** @property */ public int get_Columns() { return _columns; } /** @property */ public void set_Columns(int value) { _columns = value; } // Title property to be used as the attribute name in the Web page. /** @property */ public String get_Title() { return _title; } /** @property */ public 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.get_Rows().Add(row); // Creates a cell that contains text. for (int y = 0; y < get_Columns(); y++) { AppendCell(row, rowNumber, y); } } //CreateNewRow protected void AppendCell(TableRow row, int rowNumber, int cellNumber) { TableCell cell; TextBox textbox; cell = new TableCell(); textbox = new TextBox(); cell.get_Controls().Add(textbox); textbox.set_ID("r" + ((Int32)rowNumber).ToString() + "c" + ((Int32)cellNumber).ToString()); // Checks for the MyCell child object. if (_cellObjects.get_Item(textbox.get_ID()) != null) { MyCell cellLookup; cellLookup = (MyCell)_cellObjects.get_Item(textbox.get_ID()); textbox.set_Text(cellLookup.get_Text()); textbox.set_BackColor(cellLookup.get_BackColor()); } else { textbox.set_Text("Row: " + ((Int32)rowNumber).ToString() + " Cell: " + ((Int32)cellNumber).ToString()); } row.get_Cells().Add(cell); } // Called at runtime when a child object is added to the collection. protected void AddParsedSubObject(Object obj) { MyCell cell = (MyCell)obj; if (cell != null) { _cellObjects.Add(cell.get_CellID(), cell); } } protected 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.get_Rows().get_Count() < get_Rows()) { CreateNewRow(_table.get_Rows().get_Count()); } // Checks that each row has the correct number of columns. for (int i = 0; i < _table.get_Rows().get_Count(); i++) { while (_table.get_Rows().get_Item(i).get_Cells(). get_Count() < get_Columns()) { AppendCell(_table.get_Rows().get_Item(i), i, _table.get_Rows().get_Item(i).get_Cells().get_Count()); } while (_table.get_Rows().get_Item(i).get_Cells().get_Count() > get_Columns()) { _table.get_Rows().get_Item(i).get_Cells().RemoveAt( _table.get_Rows().get_Item(i).get_Cells().get_Count() - 1); } } } protected 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>" + get_Title() + "</h5>"); get_Controls().Add(text); _table = new Table(); _table.set_BorderWidth(new Unit(2)); get_Controls().Add(_table); } }
前述のカスタム コントロールを使用するコード例を次に示します。特に、この例では、実行時に属性と内容が定義されるテーブルを作成します。@ Register ディレクティブに示される値には、前のコマンド ラインが反映されます。
<%@ Page Language="VB" %> <%@ Register TagPrefix="AspNetSamples" Assembly="vb_mycontrolbuilder" Namespace="CustomControls" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> </script> <html > <head runat="server"> <title>ControlBuilder Example</title> </head> <body> <form id="form1" runat="server"> <div> <AspNetSamples:MyVB_CustomControl id="Custom1" title="Auto-Generated Table" columns="3" rows="3" runat="server"> <mycell cellid="r0c0" BackColor="red" text="red cell"></mycell> <mycell cellid="r2c2" BackColor="green" text="green cell"></mycell> </AspNetSamples:MyVB_CustomControl> </div> </form> </body> </html>
<%@ Page Language="C#" %> <%@ Register TagPrefix="AspNetSamples" Assembly="cs_mycontrolbuilder" Namespace="CustomControls" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> </script> <html > <head runat="server"> <title>ControlBuilder Example</title> </head> <body> <form id="form1" runat="server"> <div> <AspNetSamples:MyCS_CustomControl id="Custom1" title="Auto-Generated Table" columns="3" rows="3" runat="server"> <mycell cellid="r0c0" BackColor="red" text="red cell"></mycell> <mycell cellid="r2c2" BackColor="green" text="green cell"></mycell> </AspNetSamples:MyCS_CustomControl> </div> </form> </body> </html>
<%@ Page Language="VJ#" %> <%@ Register TagPrefix="AspNetSamples" Assembly="js_mycontrolbuilder" Namespace="CustomControls" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> </script> <html > <head runat="server"> <title>ControlBuilder Example</title> </head> <body> <form id="form1" runat="server"> <div> <AspNetSamples:MyJSL_CustomControl id="Custom1" title="Auto-Generated Table" columns="3" rows="3" runat="server"> <mycell cellid="r0c0" BackColor="red" text="red cell"></mycell> <mycell cellid="r2c2" BackColor="green" text="green cell"></mycell> </AspNetSamples:MyJSL_CustomControl> </div> </form> </body> </html>




Windows 98, Windows 2000 SP4, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


ControlBuilder コンストラクタ
アセンブリ: System.Web (system.web.dll 内)


このコンストラクタを使用して、ControlBuilder クラスの新しいインスタンスを作成します。
![]() |
---|
このコンストラクタは、通常、ASP.NET によって、ページの解析時およびコントロール階層の作成時に使用されます。開発者のコードで使用するためのものではありません。 |

Windows 98, Windows 2000 SP4, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


ControlBuilder フィールド
ControlBuilder プロパティ

名前 | 説明 | |
---|---|---|
![]() | BindingContainerType | このビルダが作成するコントロールのバインディング コンテナの型を取得します。 |
![]() | ControlType | 作成するコントロールの Type を取得します。 |
![]() | CurrentFilterResolutionService | デザイナ上でコントロールを解析したり永続化したりする際に、デバイス フィルタ関連サービスを管理するために使用される IFilterResolutionService オブジェクトを取得します。 |
![]() | DeclareType | コントロールを宣言するために codegen によって使用される型を取得します。 |
![]() | HasAspCode | コントロールにコード ブロックが格納されているかどうかを示す値を取得します。 |
![]() | ID | 作成するコントロールの識別子プロパティを取得または設定します。 |
![]() | Localize | この ControlBuilder オブジェクトによって作成されるコントロールがローカライズされるかどうかを示すブール値を取得します。 |
![]() | NamingContainerType | このビルダが作成するコントロールの名前付けコンテナの型を取得します。 |
![]() | ServiceProvider | この ControlBuilder オブジェクトのサービス オブジェクトを取得します。 |
![]() | TagName | 作成するコントロールのタグ名を取得します。 |
![]() | ThemeResolutionService | デザイン時にコントロールのテーマとスキンを管理するために使用される IThemeResolutionService オブジェクトを取得します。 |

名前 | 説明 | |
---|---|---|
![]() | FChildrenAsProperties | コントロールの ParseChildrenAttribute の ChildrenAsProperties を true に設定するかどうかを決定します。 |
![]() | FIsNonParserAccessor | コントロールに IParserAccessor インターフェイスを実装するかどうかを決定します。 |
![]() | InDesigner | ControlBuilder がデザイナで実行されているかどうかを示す値を返します。 |
![]() | InPageTheme | この ControlBuilder オブジェクトを使用してページ テーマを生成するかどうかを示すブール値を取得します。 |
![]() | Parser | コントロールを解析する TemplateParser を取得します。 |

ControlBuilder メソッド


名前 | 説明 | |
---|---|---|
![]() | Finalize | Object がガベージ コレクションにより収集される前に、その Object がリソースを解放し、その他のクリーンアップ操作を実行できるようにします。 ( Object から継承されます。) |
![]() | MemberwiseClone | 現在の Object の簡易コピーを作成します。 ( Object から継承されます。) |

ControlBuilder メンバ
コントロールとその子コントロールを作成するときにページ パーサーをサポートします。
ControlBuilder データ型で公開されるメンバを以下の表に示します。



名前 | 説明 | |
---|---|---|
![]() | BindingContainerType | このビルダが作成するコントロールのバインディング コンテナの型を取得します。 |
![]() | ControlType | 作成するコントロールの Type を取得します。 |
![]() | CurrentFilterResolutionService | デザイナ上でコントロールを解析したり永続化したりする際に、デバイス フィルタ関連サービスを管理するために使用される IFilterResolutionService オブジェクトを取得します。 |
![]() | DeclareType | コントロールを宣言するために codegen によって使用される型を取得します。 |
![]() | HasAspCode | コントロールにコード ブロックが格納されているかどうかを示す値を取得します。 |
![]() | ID | 作成するコントロールの識別子プロパティを取得または設定します。 |
![]() | Localize | この ControlBuilder オブジェクトによって作成されるコントロールがローカライズされるかどうかを示すブール値を取得します。 |
![]() | NamingContainerType | このビルダが作成するコントロールの名前付けコンテナの型を取得します。 |
![]() | ServiceProvider | この ControlBuilder オブジェクトのサービス オブジェクトを取得します。 |
![]() | TagName | 作成するコントロールのタグ名を取得します。 |
![]() | ThemeResolutionService | デザイン時にコントロールのテーマとスキンを管理するために使用される IThemeResolutionService オブジェクトを取得します。 |

名前 | 説明 | |
---|---|---|
![]() | FChildrenAsProperties | コントロールの ParseChildrenAttribute の ChildrenAsProperties を true に設定するかどうかを決定します。 |
![]() | FIsNonParserAccessor | コントロールに IParserAccessor インターフェイスを実装するかどうかを決定します。 |
![]() | InDesigner | ControlBuilder がデザイナで実行されているかどうかを示す値を返します。 |
![]() | InPageTheme | この ControlBuilder オブジェクトを使用してページ テーマを生成するかどうかを示すブール値を取得します。 |
![]() | Parser | コントロールを解析する TemplateParser を取得します。 |


名前 | 説明 | |
---|---|---|
![]() | Finalize | Object がガベージ コレクションにより収集される前に、その Object がリソースを解放し、その他のクリーンアップ操作を実行できるようにします。 (Object から継承されます。) |
![]() | MemberwiseClone | 現在の Object の簡易コピーを作成します。 (Object から継承されます。) |

- ControlBuilderのページへのリンク