1、 到了上节为止,已经把页面的布局都弄好了,这节主要来实现子控件属性和事件。
2、 第十五步,公开子控件属性,复合控件必须公开子控件的属性,就好像这些属性是复合控件的属性一样。由于自定义复合控件是按需要创建的,所以当属性的get和set访问器访问子控件时,并不能保证已经创建子控件。这就是为什么在两个访问器前调用EnsureChildControls方法的原因,通常在访问任何子控件之前,自定义控件必须调用EnsureChildControls方法。
public virtual string LblUserText
{
get
{
EnsureChildControls();
return Lbl_Name.Text;
}
set
{
EnsureChildControls();
Lbl_Name.Text = value;
}
}
public virtual string BtnShowText
{
get
{
EnsureChildControls();
return Btn_Show.Text;
}
set
{
EnsureChildControls();
Btn_Show.Text = value;
}
}
3、 第十六步,公开子控件事件,第十五步把子控件属性公开变为自身属性,这些自身属性应用到子控件引发的事件。复合控件必须捕获子控件引发的事件,并将它们公开为自身事件。这会引发个问题,复合控件如何捕获子控件引发的事件,而去代替引发的自身事件?子控件引发的是Command事件。子控件可以通过在第一章(7)介绍过的步骤来实现事件。OnCommand方法里的RaiseBubbleEvent方法是将Test事件提升为ComTestControl复合控件的事件。
private static readonly object CommandEventKey = new object();
[Browsable(false)]
public event CommandEventHandler Command
{
add { Events.AddHandler(CommandEventKey, value); }
remove { Events.RemoveHandler(CommandEventKey, value); }
}
protected virtual void OnCommand(CommandEventArgs e )
{
CommandEventHandler handler = Events[CommandEventKey] as CommandEventHandler;
if (handler != null)
{
handler(this, e);
}
RaiseBubbleEvent(this, e);
}
4、 现在已经了解子控件冒泡将自身的事件提升为父控件的事件,现在将介绍父控件如何捕获该事件,这里我们要重写OnBubbleEvent方法,才能捕获由子控件引发的事件。还要写个方法返回文本框的值。
protected override bool OnBubbleEvent(object source, EventArgs args)
{
//return base.OnBubbleEvent(source, args);
bool handled = false;
CommandEventArgs ce = args as CommandEventArgs;
if (ce != null && ce.CommandName == "Test")
{
TestEventArgs ts = new TestEventArgs(GetTxtName());
OnTest(ts);
handled = true;
}
return handled;
}
protected virtual string GetTxtName()
{
return Txt_Name.Text;
}
5、看下事件属性栏,有个Test事件,按照上章的,在事件里写弹出个对话框,会发现没反映,到底是哪里出了问题?在调试中会发现CommandName是空字符串。怎么会是个空呢?我们回头看下CreateContainerChildControl方法Btn_Show.CommandName还没给赋值,我们加上去。再调试看下就有了,实现了弹出对话框的效果了。
Btn_Show.CommandName = "Test";
代码下载地址:点击下载
本博客内容有些来源于网络或书籍如果侵害到你的权益,请及时联系我(hch458458@vip.qq.com)
版权归nethch所有,转载请注明出处!