複合控制項
繼承CompositeControl
布局
實現INamingContainer介面
INamingContainer是一個標記介面,沒有任何屬性方法
提供一個受保護的虛方法實現控制項的初始化
加入控制項Container.Controls.add
提供一個受保護的虛方法添加容器控制項AddContainer(Container con)
通過EnsureChildControls檢查bool ChildControlsCreated避免多次建立組件
在建立子控制項後要把ChildControlsCreated = true;
tagkey來確定要包含整個自訂控制項的HTML元素
該控制項重寫
get (return HtmlTextWriterTag.Table;)
RenderContrnts(HtmlTextWriter writer)
writer.RenderBeginTag()
RenderContainer(Container,writer)
RenderContainer(Container,writer)
writer.RenderEndTag()
子控制項屬性
public virtual string PayText
{
get
{
EnsureChildControls();
return PayLabel.Text;
}
set
{
EnsureChildControls();
PayLabel.Text = value;
}
}
子控制項引發Command事件
private static readonly objectiveCommandEventKey = new object();
public event CommandEventHandle Command
{
add {Events.AddHandler(CommandEventKey,value);}
remove {Event.RemoveHandler(CommandEventKey,value);}
}
protected virtual void OnCommand(CommandEventArg e)
{
CommandEventHandler handler = Event[CommandEventKey] as CommandEventHandler;
if (handler != null) handler(this e);
RaiseBubblerEvent(this,e);
}
CommandEventArgs 事件數目據類為了保持命令名稱和命令參數,該類公開了兩個屬性CommandName和CommandArgument
將CommandEventArgs傳給RaiseBubblerEvent方法,該方法把子控制項的事件提升為父控制項的事件
potected virtual void RaisePostBackEvent(string EvnentArgument)
{
...
CommandEventArgs e = new CommandEventArgs(CommandName, CommandArgument);
OnCommand(e);
}
Control類公開了OnbubbleEvent方法,符合控制項需要重寫。
protected override bool OnBubbleEvent(object source, EventArgs args)
首先檢測是否捕獲的是Command事件
CommandEventArgs ce = arg as CommandEventArgs;
if (ce != null && ce.CommandName = "ValidateCreditCard")
這個過程可以擷取子控制項資訊,構建事件數目據類,觸發事件
CompositeControl提供了必須支援的特性
1)重寫Controls集合
2)實現INamingInterface
3)重寫DataBind方法
4)實現ICompositeControlDesignerAccessor介面。該介面定義了一個ReCreateChildControls方法
5)在實現Render前,處於設計模式時,可重寫Render方法來調用EnsureChildControls方法
重寫Controls集合
public override ControlCollection Control
{
get{
EnsureChildControl();
return base.Controls;
}
}
INamingContainer為ClientID和UniqueID屬性設定唯一值
子控制項繼承了Control類的NamingContainer屬性,該屬性指向子控制項實現了INamingContainer介面的上級父控制項