說明(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. 通過寫這幾個例子,對事件的使用熟練了許多,認識也加深了一些。但是感覺現在的事件都是用來窗體傳值,不知道后面還會接觸到什么其他應用?
