CompositeControl
ポイント
- VS のデザイナ上でも正常に動作させるために、複合コントロールの生成時に内部コントロールの生成も行う
- デザイナのことを考えなければ CreateChildControls メソッドで生成しても問題無い
- その場合、内部コントロールにアクセスするプロパティでは毎回 EnsureChildControls を呼び出す必要がある
- デザイナのことを考えなければ CreateChildControls メソッドで生成しても問題無い
- 既定では複合コントロールは span タグで囲まれるが、TagKey プロパティをオーバーライドすれば別のタグに変更可能
- このタグに、ID や CssClass 等のプロパティ値が適用される
MyList.cs
using System; using System.ComponentModel; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; namespace Sample.Controls { [ParseChildren(true, "Items")] [PersistChildren(false)] public class MyList : CompositeControl { private HtmlGenericControl _legend = new HtmlGenericControl("legend"); private RadioButtonList _radioButtonList = new RadioButtonList(); [MergableProperty(false)] [PersistenceMode(PersistenceMode.InnerDefaultProperty)] public ListItemCollection Items { get { return this._radioButtonList.Items; } } public string Caption { get { return this._legend.InnerText; } set { this._legend.InnerText = value; } } protected override HtmlTextWriterTag TagKey { get { return HtmlTextWriterTag.Fieldset; } } protected override void CreateChildControls() { this.Controls.Add(this._legend); this.Controls.Add(this._radioButtonList); } } }
Default.aspx (1)
<%@ Register Assembly="Sample" Namespace="Sample.Controls" TagPrefix="my" %>
Default.aspx (2)
<my:MyList runat="server" ID="_myList1" Caption="My List 1"> <asp:ListItem Text="ほげ" Value="Hoge" /> <asp:ListItem Text="ふが" Value="Fuga" /> <asp:ListItem Text="ぴよ" Value="Piyo" /> </my:MyList>