zoukankan      html  css  js  c++  java
  • 复合控件和事件(5)——你Call我应

    上一篇复合控件和事件(4)——移花接木
    先征求个题目吧,这个名字越来越难起了,暂时就先名为《你Call我应》吧。有好的建议记得留言给我~
    上一篇提到了“移花接木”之术,原理就是简单地把自己的订阅过程交给别人,也可以称之为“代购”吧。
    我们知道我们经常在事件的写法中包含OnEventName的方法(用On打头算是一个约定吧)。它是一个函数,它被调用后它的内容将被执行。找一个经典的写法进行引述吧:

            protected virtual void OnControlTextChanged(ControlEventArgs e)
            
    {
                
    if (ControlTextChanged != null)
                
    {
                    ControlTextChanged(
    this, e);
                }

            }

    这段代码是本节示例中我写的关于事件处理程序的部分,其中virtual并不是必须的,ControlTextChanged 是我们定义的事件,看看调用OnControlTextChanged后我们都做了什么呢?
    1、首先判断事件是否为空,如果不为空执行步骤2
    2、通过事件委托,执行被订阅到事件的事件处理程序(通常这些事件处理程序就是我们在aspx页面中通过属性面板添加的那些事件处理程序(但不表示仅仅aspx中可以如此使用,任何地方显式或隐式使用了事件订阅语法,将事件处理程序订阅给事件的所有此类事件处理程序都将被执行,执行顺序可以类似“先进先出”))
    3、事件处理程序被唤醒,依次执行相应事件处理程序(似乎目的达到了!exciting!)
    假设我们的控件已经完成了,(想像一下)现在向页面中添加了我们控件,并添加事件处理程序,并订阅它(asp2.0中这个过程已经对您相对更透明了,参见复合控件和事件(3)——事件基础中的相关内容),我们把事件处理程序订阅到我们自己定义的事件上,运行我们的程序,激活事件(本示例中继续以下拉列表框来演示,这里的事件就是“下拉框中的文字变化”),我们实际上触发的是子控件(这里是下拉框,这个下拉框是包含在我们的控件中的一个private DropDownList ddl;)的相应事件,只是这时候它们的名字被我们起的刚好近似罢了。因此这时候激活的是子控件的事件处理程序。聪明的读者一定想到了解决办法:
    1、提供一个事件处理程序,并将其订阅给子控件;
    2、如果有数据参数的,则将参数进行传递
    3、在事件处理程序中执行我们复合控件的事件的相关事件处理程序(上文中一直在提的OnEventName函数)

    因此我们有如下代码:

     1        /// <summary>
     2        /// 创建并添加子控件
     3        /// </summary>

     4        protected virtual void CreateControlHierarchy()
     5        {
     6            this.ddl = new DropDownList();
     7            this.ddl.TextChanged += new EventHandler(ddl_TextChanged);
     8            this.Controls.Add(ddl);
     9        }

    10
    11        private void ddl_TextChanged(object sender, EventArgs e)
    12        {
    13            ControlEventArgs cea = new ControlEventArgs();
    14            cea.Message = "ControlTextChanged!";
    15            OnControlTextChanged(cea);
    16        }

    其中第7行做到了步骤1,第13-14行做到了第2步,第15行做到了第3步。
    其实以上只是一些必要步骤,你还能做的事更多了,因为程序是因为执行了OnEventName的函数才执行了你在外部写的事件处理程序,这样的话,这里可以被理解成是一个执行程序的Driver,那么你可以在这里写下自己的运算逻辑,比如这里的第14行,当然写死了可能不太好,那你外部定义一个比如作者名之类的再通过配置文件反射进来也是个不错的选择,另外你可以让一个下拉事件同时执行多个事件,这样你在外部如果定义了三个事件处理程序,并希望它们会在事件激发(下拉框值变化)的时候执行多项事件从处理程序,也是可以的,只要在这里写上多个OnEventName就可以了,甚至你可以在这里调用工厂来执行不同的事件处理程序等,不过至于意义有多大,就得看你的应用场景了。
    这一些特点在上一篇中所涉及的移花接木中则无法实现,本文中所提的方法不但可以满足需求,还能移花接木之上有所突破。

    CompositeControl5.cs
    CompositeControl5.aspx
    CompostieControl5.aspx.cs
    CompositeControl5.aspx.designer.cs
  • 相关阅读:
    分布式事务之最终一致性BASE理论
    CAP理论
    Comparator中返回0导致数据丢失的大坑
    电脑主板分类
    SimpleDateFormat线程不安全
    Redis面试题
    JS闭包
    ES6将两个数组合并成一个对象数组
    视频色彩空间RGB、YUV、YCbCr
    c#接口作用的深入理解
  • 原文地址:https://www.cnblogs.com/volnet/p/827709.html
Copyright © 2011-2022 走看看