第二章 .Net 控件开发(WebForm) 开发自定义复合控件(3) 事件冒泡

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所有,转载请注明出处!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值