CompositeControl

ポイント

  • VS のデザイナ上でも正常に動作させるために、複合コントロールの生成時に内部コントロールの生成も行う
    • デザイナのことを考えなければ CreateChildControls メソッドで生成しても問題無い
      • その場合、内部コントロールにアクセスするプロパティでは毎回 EnsureChildControls を呼び出す必要がある
  • 既定では複合コントロールは 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>