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

<AttributeUsageAttribute(AttributeTargets.Class)> _ Public NotInheritable Class ParseChildrenAttribute Inherits Attribute
[AttributeUsageAttribute(AttributeTargets.Class)] public sealed class ParseChildrenAttribute : Attribute
[AttributeUsageAttribute(AttributeTargets::Class)] public ref class ParseChildrenAttribute sealed : public Attribute

ParseChildrenAttribute クラスを使用して、カスタム サーバー コントロールを ParseChildrenAttribute メタデータ属性でマークすることにより、サーバー コントロールに対して解析ロジックを指定できます。
サーバー コントロールをメタデータ属性 ParseChildren(true) でマークすると、パーサーは、そのサーバー コントロールのタグ内の要素をプロパティとして解釈します。このシナリオでは、ChildrenAsProperties は true です。
サーバー コントロールをメタデータ属性 ParseChildren(true,"<Default Property>") でマークすると、DefaultProperty プロパティがその属性に渡されるプロパティ名に設定されます。
サーバー コントロールをメタデータ属性 ParseChildren(false) でマークすると (既定値)、パーサーは、サーバー コントロールのタグ内の要素を、関連付けられている ControlBuilder で解析する内容、つまりコントロールとして解釈します。このシナリオでは、ChildrenAsProperties は false です。
属性の使用方法については、「属性を使用したメタデータの拡張」を参照してください。

このセクションには、2 つのコード例が含まれています。最初のコード例では、ParseChildrenAttribute クラスのプロパティを設定する方法を示します。2 番目のコード例では、ASP.NET ページでクラスを使用する方法を示します。
次のコード例では、CollectionPropertyControl というカスタム サーバー コントロールの ParseChildrenAttribute オブジェクトを設定する方法を示します。ParseChildrenAttribute は ChildrenAsProperties プロパティを true に設定し、DefaultProperty プロパティを Employee クラスに設定しています。
Imports System Imports System.Collections Imports System.Web Imports System.Web.UI Imports System.Web.UI.WebControls Imports System.Security.Permissions Namespace Samples.AspNet.VB.Controls ' The child element class. <AspNetHostingPermission(SecurityAction.Demand, _ Level:=AspNetHostingPermissionLevel.Minimal)> _ Public NotInheritable Class Employee Private _name As String Private _title As String Private _alias As String Public Sub New() Me.New("", "", "") End Sub 'New Public Sub New(ByVal name As String, ByVal title As String, ByVal employeeAlias As String) Me._name = name Me._title = title Me._alias = employeeAlias End Sub 'New Public Property Name() As String Get Return _name End Get Set(ByVal value As String) _name = Value End Set End Property Public Property Title() As String Get Return _title End Get Set(ByVal value As String) _title = Value End Set End Property Public Property [Alias]() As String Get Return _alias End Get Set(ByVal value As String) _alias = Value End Set End Property End Class 'Employee ' Use the ParseChildren attribute to set the ChildrenAsProperties ' and DefaultProperty properties. Using this constructor, the ' control parses all child controls as properties and must define ' a public property named Employees, which it declares as ' an ArrayList. Nested (child) elements must correspond to ' child elements of the Employees property or to other ' properties of the control. <ParseChildren(True, "Employees")> _ <AspNetHostingPermission(SecurityAction.Demand, _ Level:=AspNetHostingPermissionLevel.Minimal)> _ Public NotInheritable Class CollectionPropertyControl Inherits Control Private _header As String Private _employees As New ArrayList() Public Property Header() As String Get Return _header End Get Set(ByVal value As String) _header = Value End Set End Property Public ReadOnly Property Employees() As ArrayList Get Return _employees End Get End Property ' Override the CreateChildControls method to ' add child controls to the Employees property when this ' custom control is requested from a page. Protected Overrides Sub CreateChildControls() Dim label As New Label() label.Text = Header label.BackColor = System.Drawing.Color.Beige label.ForeColor = System.Drawing.Color.Red Controls.Add(label) Controls.Add(New LiteralControl("<BR> <BR>")) Dim table As New Table() Dim htr As New TableRow() Dim hcell1 As New TableHeaderCell() hcell1.Text = "Name" htr.Cells.Add(hcell1) Dim hcell2 As New TableHeaderCell() hcell2.Text = "Title" htr.Cells.Add(hcell2) Dim hcell3 As New TableHeaderCell() hcell3.Text = "Alias" htr.Cells.Add(hcell3) table.Rows.Add(htr) table.BorderWidth = Unit.Pixel(2) table.BackColor = System.Drawing.Color.Beige table.ForeColor = System.Drawing.Color.Red Dim employee As Employee For Each employee In Employees Dim tr As New TableRow() Dim cell1 As New TableCell() cell1.Text = employee.Name tr.Cells.Add(cell1) Dim cell2 As New TableCell() cell2.Text = employee.Title tr.Cells.Add(cell2) Dim cell3 As New TableCell() cell3.Text = employee.Alias tr.Cells.Add(cell3) table.Rows.Add(tr) Next employee Controls.Add(table) End Sub 'CreateChildControls End Class End Namespace
using System; using System.Collections; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Security.Permissions; namespace Samples.AspNet.CS.Controls { // The child element class. [AspNetHostingPermission(SecurityAction.Demand, Level=AspNetHostingPermissionLevel.Minimal)] public sealed class Employee { private String name; private String title; private String alias; public Employee():this ("" ,"",""){} public Employee (String name, String title, String alias) { this.name = name; this.title = title; this.alias = alias; } public String Name { get { return name; } set { name = value; } } public String Title { get { return title; } set { title = value; } } public String Alias { get { return alias; } set { alias = value; } } } // Use the ParseChildren attribute to set the ChildrenAsProperties // and DefaultProperty properties. Using this constructor, the // control parses all child controls as properties and must define // a public property named Employees, which it declares as // an ArrayList. Nested (child) elements must correspond to // child elements of the Employees property or to other // properties of the control. [ParseChildren(true, "Employees")] [AspNetHostingPermission(SecurityAction.Demand, Level=AspNetHostingPermissionLevel.Minimal)] public sealed class CollectionPropertyControl : Control { private String header; private ArrayList employees = new ArrayList(); public String Header { get { return header; } set { header = value; } } public ArrayList Employees { get { return employees; } } // Override the CreateChildControls method to // add child controls to the Employees property when this // custom control is requested from a page. protected override void CreateChildControls() { Label label = new Label(); label.Text = Header; label.BackColor = System.Drawing.Color.Beige; label.ForeColor = System.Drawing.Color.Red; Controls.Add(label); Controls.Add(new LiteralControl("<BR> <BR>")); Table table = new Table(); TableRow htr = new TableRow(); TableHeaderCell hcell1 = new TableHeaderCell(); hcell1.Text = "Name"; htr.Cells.Add(hcell1); TableHeaderCell hcell2 = new TableHeaderCell(); hcell2.Text = "Title"; htr.Cells.Add(hcell2); TableHeaderCell hcell3 = new TableHeaderCell(); hcell3.Text = "Alias"; htr.Cells.Add(hcell3); table.Rows.Add(htr); table.BorderWidth = 2; table.BackColor = System.Drawing.Color.Beige; table.ForeColor = System.Drawing.Color.Red; foreach (Employee employee in Employees) { TableRow tr = new TableRow(); TableCell cell1 = new TableCell(); cell1.Text = employee.Name; tr.Cells.Add(cell1); TableCell cell2 = new TableCell(); cell2.Text = employee.Title; tr.Cells.Add(cell2); TableCell cell3 = new TableCell(); cell3.Text = employee.Alias; tr.Cells.Add(cell3); table.Rows.Add(tr); } Controls.Add(table); } } }
package ParseChildrenSamples; // When compiling this class, name it ParseChildren.dll. // Create a namespace that defines two classes: one is a custom control // named Employee, which is created for every instance of a child // element with its name declared in a page associated with this namespace , // and the other, named Employees, that contains these child elements. import System.*; import System.Collections.*; import System.Web.*; import System.Web.UI.*; import System.Web.UI.WebControls.*; // The child element class. public class Employee { private String name; private String title; private String alias; public Employee() { this("", "", ""); } //Employee public Employee(String name, String title, String alias) { this.name = name; this.title = title; this.alias = alias; } //Employee /** @property */ public String get_Name() { return name; } //get_Name /** @property */ public void set_Name(String value) { name = value; } //set_Name /** @property */ public String get_Title() { return title; } //get_Title /** @property */ public void set_Title(String value) { title = value; } //set_Title /** @property */ public String get_Alias() { return alias; } //get_Alias /** @property */ public void set_Alias(String value) { alias = value; } //set_Alias } //Employee // Use the ParseChildren attribute to set the ChildrenAsProperties // and DefaultProperty properties. Using this constructor, the // control parses all child controls as properties and must define // a public property named Employees, which it declares as // an ArrayList. Nested (child) elements must correspond to // child elements of the Employees property or to other // properties of the control. /** @attribute ParseChildren(true, "Employees") */ public class CollectionPropertyControl extends Control { private String header; private ArrayList employees = new ArrayList(); /** @property */ public String get_Header() { return header; } //get_Header /** @property */ public void set_Header(String value) { header = value; } //set_Header /** @property */ public ArrayList get_Employees() { return employees; } //get_Employees // Override the CreateChildControls method to // add child controls to the Employees property when this // custom control is requested from a page. protected void CreateChildControls() { Label label = new Label(); label.set_Text(get_Header()); label.set_BackColor(System.Drawing.Color.get_Beige()); label.set_ForeColor(System.Drawing.Color.get_Red()); get_Controls().Add(label); get_Controls().Add(new LiteralControl("<BR> <BR>")); Table table = new Table(); TableRow htr = new TableRow(); TableHeaderCell hCell1 = new TableHeaderCell(); hCell1.set_Text("Name"); htr.get_Cells().Add(hCell1); TableHeaderCell hCell2 = new TableHeaderCell(); hCell2.set_Text("Title"); htr.get_Cells().Add(hCell2); TableHeaderCell hCell3 = new TableHeaderCell(); hCell3.set_Text("Alias"); htr.get_Cells().Add(hCell3); table.get_Rows().Add(htr); table.set_BorderWidth(new Unit(2)); table.set_BackColor(System.Drawing.Color.get_Beige()); table.set_ForeColor(System.Drawing.Color.get_Red()); Employee employee = null; for (int iCtr = 0; iCtr < get_Employees().get_Count(); iCtr++) { employee = (Employee)get_Employees().get_Item(iCtr); TableRow tr = new TableRow(); TableCell cell1 = new TableCell(); cell1.set_Text(employee.get_Name()); tr.get_Cells().Add(cell1); TableCell cell2 = new TableCell(); cell2.set_Text(employee.get_Title()); tr.get_Cells().Add(cell2); TableCell cell3 = new TableCell(); cell3.set_Text(employee.get_Alias()); tr.get_Cells().Add(cell3); table.get_Rows().Add(tr); } get_Controls().Add(table); } //CreateChildControls } //CollectionPropertyControl
次のコード例では、CollectionPropertyControl クラスと Employee クラスを ASP.NET ページで使用する方法を示します。Employee クラスのインスタンスが宣言で追加されます。
<%@ Page Language="VB" %> <%@ Register TagPrefix="AspSample" Assembly="Samples.AspNet.VB.Controls" Namespace="Samples.AspNet.VB.Controls" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) ' Verify attribute values. Dim p As ParseChildrenAttribute = _ Attribute.GetCustomAttribute(GetType(CollectionPropertyControl), _ GetType(ParseChildrenAttribute)) Dim sb As New StringBuilder() sb.Append("The DefaultProperty property is " & p.DefaultProperty.ToString() & "<br>") sb.Append("The ChildrenAsProperties property is " & p.ChildrenAsProperties.ToString() & "<br>") sb.Append("The IsDefaultAttribute method returns " & p.IsDefaultAttribute().ToString()) Message.Text = sb.ToString() End Sub </script> <html > <head id="Head1" runat="server"> <title>PersistChildrenAttribute</title> </head> <body> <form id="Form1" runat="server"> <div> <asp:Label ID="Message" runat="server"/> <AspSample:CollectionPropertyControl id="CollectionPropertyControl1" runat="server"> <AspSample:Employee Name="Employee 1" Title="Title 1" Alias="Alias 1" /> <AspSample:Employee Name="Employee 2" Title="Title 2" Alias="Alias 2" /> </AspSample:CollectionPropertyControl> </div> </form> </body> </html>
<%@ Page Language="C#" Debug="true" %> <%@ Register TagPrefix="AspSample" Assembly="Samples.AspNet.CS.Controls" Namespace="Samples.AspNet.CS.Controls" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> protected void Page_Load(object sender, EventArgs e) { // Verify attribute values. ParseChildrenAttribute p = (ParseChildrenAttribute)Attribute.GetCustomAttribute(typeof(CollectionPropertyControl) , typeof(ParseChildrenAttribute)); StringBuilder sb = new StringBuilder(); sb.Append("The DefaultProperty property is " + p.DefaultProperty.ToString() + "<br>"); sb.Append("The ChildrenAsProperties property is " + p.ChildrenAsProperties.ToString() + "<br>"); sb.Append("The IsDefaultAttribute method returns " + p.IsDefaultAttribute().ToString()); Message.Text = sb.ToString(); } </script> <html > <head runat="server"> <title>ParseChildrenAttribute Example</title> </head> <body> <form runat="server"> <div> <asp:Label ID="Message" runat="server"/> <AspSample:CollectionPropertyControl id="CollectionPropertyControl1" runat="server"> <AspSample:Employee Name="Employee 1" Title="Title 1" Alias="Alias 1" /> <AspSample:Employee Name="Employee 2" Title="Title 2" Alias="Alias 2" /> </AspSample:CollectionPropertyControl> </div> </form> </body> </html>


System.Attribute
System.Web.UI.ParseChildrenAttribute


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 によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


- ParseChildrenAttribute クラスのページへのリンク