委托和事件的关系

   首先要知道,委托是一种数据类型,委托的概念就是事件的引用,事件就是依靠委托创建的一种有有限制的委托变量,他是为了解决委托在一些情况下的问题而出现的。。

用例子来看:

在Form1类里

        private void Form1_Load(object sender, EventArgs e)
        {
            ucButton1.tripleClick = TripleClick;
            ucButton1.tripleClick = TripleClick3;
            ucButton1.tripleClick = TripleClick2;
        }

     
       
        private void TripleClick()
        {
            MessageBox.Show("再在我在Form1中,执行三连击事件!");
        }

        private void TripleClick2()
        {
            MessageBox.Show("222222222222222222222222222!");
        }

        private void TripleClick3()
        {
            MessageBox.Show("3333333333333333333333333333!");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //通过委托来实现事件的功能的问题有:
            // 1,可以在类的内部来触发,也可以在类的外部触发。因为委托变量必须是是public类型的。
            //2 委托变量的赋值方式可以使用=,这样就有可能把之前的委托指向覆盖。
            //ucButton1.tripleClick();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //2 委托变量的赋值方式可以使用=,这样就有可能把之前的委托指向覆盖。
            ucButton1.tripleClick = TripleClick2;
           // ucButton1.tripleClick();
        }

 

在自定义控件 UCButton中 :

public delegate void TripleClickDelegate();
    public partial class UCButton : UserControl
    {

public TripleClickDelegate tripleClick;
        //如果把tripleClick设置为private,那么的确在外部不能触发了,但是也不能在外部赋值了。

public UCButton()
        {
            InitializeComponent();
        }

    int count = 0;
        private void btnTriple_Click(object sender, EventArgs e)
        {
            count++;
            if (count >= 3)
            {
                if (tripleClick != null)
                {
                    //当用户三连击后触发指定的方法
                    tripleClick();
                }
                count = 0;
            }
         
        }

 

而如果使用事件来写的话这两个问题就可以解决

首先事件不能使用=赋值只能在-=或+=左边 其次 事件只能在内部调用在外面只能赋值。。。

Form1类:

   private void Form2_Load(object sender, EventArgs e)
        {
            ucTtripleClickEvent1.tripleClick += new MyTripleClick(Click2);
            ucTtripleClickEvent1.tripleClick+= Click1;
        }

        void Click1()
        {
          MessageBox.Show("通过事件实现三连击!");
        }
        void Click2()
        {
            MessageBox.Show("22222三连击!");
        }

 

三连击控件类:

public delegate void MyTripleClick();
    public partial class UCTtripleClickEvent : UserControl
    {
        public UCTtripleClickEvent()
        {
            InitializeComponent();
        }
       
        //有了委托类型以后就可以定义事件了
        public event MyTripleClick tripleClick;

        int count = 0;
        private void button1_Click(object sender, EventArgs e)
        {
            count++;
            if (count >= 3)
            {
                //用事件来实现,用之前要定义事件类型,要定义事件必须有委托,否则无法使用。
                tripleClick();
                count = 0;
            }

        }
    }

 

posted on 2012-09-14 15:40  gongth_12  阅读(358)  评论(0编辑  收藏  举报

导航