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