說明(2018-4-9 23:01:20):app
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裏拿到?事件就不行?this
因而在羣裏問大佬,大佬回了一句:spa
羞愧難當,說了句謝謝就滾去查資料了o(* ̄︶ ̄*)o.net
3. 而後就看到了上面的文章,其中的核心技術就是:在Form1中初始化Form2以後,就把Form1中的方法綁定到Form2的事件上。這一點其實和以前委託傳值有點相似,委託傳值是在Form2中加一個構造函數,在Form1中初始化Form2的時候把委託做爲參數傳入Form2。哇?寫到這裏我怎麼以爲兩種方法一毛同樣?隱隱以爲底層應該是一種寫法?不過我不太喜歡再寫個構造函數,也不喜歡命名空間下面再寫個委託聲明,直接定義事件多簡單。code
4. 下面貼代碼:orm
Form1.cs:blog
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. 經過寫這幾個例子,對事件的使用熟練了許多,認識也加深了一些。可是感受如今的事件都是用來窗體傳值,不知道後面還會接觸到什麼其餘應用?