C#事件作用和用法


例如有下面的需求需要實現:程序主畫面中彈出一個子窗口。此時主畫面仍然可以接收用戶的操作(子窗口是非模態的)。子窗口上進行某些操作,根據操作的結果要在主畫面上顯示不同的數據。

即如下圖所示:

大多數我們會這樣做:

表單1窗口定義:

 1  public partial class Form1 : Form
 2     {
 3 
 4         public string LabelName
 5         {
 6             get { return this.label1.Text; }
 7             set { this.label1.Text = value; }
 8         }
 9 
10         public Form1()
11         {
12             InitializeComponent();
13             this.button1.Click += new EventHandler(button1_Click);
14         }
15 
16         /// <summary>
17         /// 按鈕觸發
18         /// </summary>
19         /// <param name="sender"></param>
20         /// <param name="e"></param>
21         private void button1_Click(object sender, EventArgs e)
22         {
23             Form2 form2 = new Form2();
24             form2.form1 = this;
25             form2.Show();
26         }
27     }
View Code

表單2窗口定義:

 1     public partial class Form2 : Form
 2     {
 3         public Form1 form1;
 4         public Form2()
 5         {
 6             InitializeComponent();
 7             this.button1.Click += new EventHandler(button1_Click);
 8         }
 9 
10         /// <summary>
11         /// 表單2按鈕觸發
12         /// </summary>
13         /// <param name="sender"></param>
14         /// <param name="e"></param>
15         private void button1_Click(object sender, EventArgs e)
16         {
17             form1.LabelName = "改變之后";
18         }
19     }
View Code

這樣雖然可以達到目的,但是各個模塊之間產生了很強的耦合。一般說來模塊之間的調用應該是單方向的:模塊A調用了模塊B,模塊B就不應該反向調用A,否則就破壞了程序的層次,加強了耦合程度,也使得功能的改變和追加變得很困難。

所以這里就用到了事件:

下邊是表單2中的事件定義:

 1  public partial class Form2 : Form
 2     {
 3         public delegate void OutputMessage(object sender, System.EventArgs e);
 4         public event OutputMessage ButtonClick;
 5 
 6         public Form2()
 7         {
 8             InitializeComponent();

 9             this.button1.Click += new EventHandler(button1_Click);
10         }
11 
12         /// <summary>
13         /// 表單2按鈕觸發
14         /// </summary>
15         /// <param name="sender"></param>
16         /// <param name="e"></param>
17         private void button1_Click(object sender, EventArgs e)
18         {
19             ButtonClick(this, e);
20         }
21     }

然后在表單1中進行捕獲:

 1 public partial class Form1 : Form
 2     {
 3         public Form1()
 4         {
 5             InitializeComponent();
 6             this.button1.Click += new EventHandler(button1_Click);
 7         }
 8 
 9         /// <summary>
10         /// 按鈕觸發
11         /// </summary>
12         /// <param name="sender"></param>
13         /// <param name="e"></param>
14         private void button1_Click(object sender, EventArgs e)
15         {
16             Form2 form = new Form2();
17             form.Show();
18             form.ButtonClick += new Form2.OutputMessage(form_ClickButton);
19         }
20 
21         private void form_ClickButton(object sender, EventArgs e)
22         {
23             this.label1.Text = "改變之后";
24         }
25     }

這樣,各個模塊專心的做自己的事情,不需要過問其他模塊的事情。

不知道說的對不對,還請指教。。。

原文:http://www.cnblogs.com/cn-blogs/p/3413652.html

 

 


免責聲明!

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



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