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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM