C#学习笔记(36)——事件传值(非常牛逼!)

说明(2018-4-9 23:01:20):

1. 这个真的想了很久,从晚上八点半写完上一篇博客,一直想到现在11点,以为没有办法实现了,结果看到一篇CSDN的文章,虽然没有看明白,但是看到一行代码后灵光一闪。原文地址https://blog.csdn.net/happythomas/article/details/32120741,在里面作者也是看了另一篇文章https://bbs.csdn.net/topics/300200223,居然是09年的上古文章,里面的代码写法都有点看不懂,RoutedEventArgs 好像是WPF里的路由事件?不管了,以后用到再说吧!

2. 本来我很幼稚的以为在Form1里定义一个事件public event EventHandler MyEve,就能在Form2里用了。后来发现VS直接报错,百思不得其解,凭啥委托就能在Form2里拿到?事件就不行?

 

 

 

于是在群里问大佬,大佬回了一句:

羞愧难当,说了句谢谢就滚去查资料了o(* ̄︶ ̄*)o

3. 然后就看到了上面的文章,其中的核心技术就是:在Form1中初始化Form2之后,就把Form1中的方法绑定到Form2的事件上。这一点其实和之前委托传值有点类似,委托传值是在Form2中加一个构造函数,在Form1中初始化Form2的时候把委托作为参数传入Form2。哇?写到这里我怎么觉得两种方法一毛一样?隐隐觉得底层应该是一种写法?不过我不太喜欢再写个构造函数,也不喜欢命名空间下面再写个委托声明,直接定义事件多简单。

4. 下面贴代码:

Form1.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _08事件传值
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //public delegate void EventHandler(object sender, EventArgs e);
        //实例化FORM1 才能访问到FORM1下的公共成员(请教群里大佬,为啥在Form2里获取不到MyEve)
        //public event MyDel Mdl;
        public event EventHandler MyEve;
        private void button1_Click(object sender, EventArgs e)
        {

            Form2 f2 = new Form2();
            //这一步必须要实例化f2才能绑定事件吗?
            MyEve += f2.ShowTxt;
            //试试在这里绑定Form2里的事件,试完可以!太牛逼了!!
            f2.MyEve2 += ShowTxt2;
            MyEventArgs mea = new MyEventArgs();
            mea.Str = textBox1.Text;
            if (MyEve != null)
            {
                MyEve(this, mea);
                f2.ShowDialog();
            }
            else
            {
                MessageBox.Show("MyEve为空");
            }
        }
        public void ShowTxt2(object sender, EventArgs e)
        {
            MyEventArgs mea = e as MyEventArgs;
            textBox1.Text = mea.Str;
        }
    }
    public class MyEventArgs : EventArgs
    {
        public string Str { get; set; }
    }
}

Form2.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _08事件传值
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        //另一种传值方法,在Form2里定义一个属性,在Form1里实例化Form2的时候赋值
        
        private void Form2_Load(object sender, EventArgs e)
        {
            
        }
        public event EventHandler MyEve2;
        private void button1_Click(object sender, EventArgs e)
        {
            if (MyEve2!=null)
            {
                MyEventArgs mea = new MyEventArgs();
                mea.Str = textBox1.Text;
                MyEve2(this,mea);
            }
        }

        public void ShowTxt(object sender, EventArgs e)
        {
            MyEventArgs mea = e as MyEventArgs;
            textBox1.Text = mea.Str;
        }

    }
    
}

运行效果:

总结:

1. 事件的套路就是:

(1)在第一个窗体里定义一个事件:public event EventHandler MyEve;

(2)在第二个窗体里写一个方法:public void ShowTxt(object sender, EventArgs e),有参数的话顺便建一个参数类传参:public class MyEventArgs : EventArgs

(3)在第一个窗体里绑定这个方法,然后调用。

2. 通过写这几个例子,对事件的使用熟练了许多,认识也加深了一些。但是感觉现在的事件都是用来窗体传值,不知道后面还会接触到什么其他应用?

 

原文地址:https://www.cnblogs.com/Jacklovely/p/8764469.html