理解C#中的代理和事件(二)

發表于:2007-05-25來源:作者:點擊數: 標簽:事件代理理解中的
理解C#中的代理和事件(二) 嗨!大家好,還記得剛才的那篇關于代理的嗎?你是不是要問我為什么要分開來寫? 原因很簡單他們說要7篇以上才可以成為專題作家.噢,天啊,事實上這是我的第九篇 可是那兩篇.還在審核中.開玩笑的,事實上是,結構,代理和事件有聯系,可是也是

理解C#中的代理和事件(二)

嗨!大家好,還記得剛才的那篇關于代理的嗎?你是不是要問我為什么要分開來寫?

原因很簡單他們說要7篇以上才可以成為專題作家.噢,天啊,事實上這是我的第九篇


可是那兩篇.還在審核中.開玩笑的,事實上是,結構,代理和事件有聯系,可是也是可以

分開來討論的兩個話題.這就是我為什么要分開,因為,很多朋友一開始用到代理和事件

的時候,都是在給一個button或一個窗體添加事件的時候用到的.所以經??梢钥吹?有

人一提到代理和事件就會自然想到windows的時間驅動.是的那是最常用的,可是事實上

也是可以分開使用的,至少代理就是那樣的.代理可以脫離事件來獨立生存.上面的那一篇

正如你看到的那樣.好吧,不多說了,讓我們進入正題.

事件:

理解事件,這一點也不難,事實上,每個人每天都在經歷著這樣或那樣的事件,然后組成了,你

的生活.想想,一個天氣預報員通知你說明天要下雨了.很自然的,你會想到,你該代把傘.是的

這就是事件.天氣預報發出這個事件通知,然后你來處理這個事件.你所做的就是帶把傘來擋雨.

就象你常做的那樣,你點擊一個button然后發出click事件,接下來當然是處理這個事件了,也許是

彈出一個窗口,或別的什么事情這些都有可能發生,甚至是關閉計算機.這些都是用戶事件.因為用戶

觸發GUI然后發生這些事件.

下面我們來看看C#中是如何處理的.那么我前面的那篇中曾提到過,把動詞變成名詞.你會想到什么?

是+ing嗎?哈哈..開個玩笑,當然不是,我們不是在做英文聯系.好吧,是代理,就象你常做的那樣

在IDE環境中,你拖一個button到窗體上,然后雙擊它,你會看到什么?進入代碼界面了嗎?然后你就

來處理事件.可這和代理有什么關系?恩,你為什么不仔細找找看通常有怎么

this.button1.Click += new System.EventHandler(this.button1_Click);一句在你的
InitializeComponent()函數中.是的,這就是代理.它把事件放入了代理中.那么事件呢?

在this.button1_Click方法中你會看到它有兩個參數,一個是object類型的sender,這個很簡單

顧名思義它就是事件的發起人.它是誰,你只要問問它就知道了.那么第二個呢?是事件,對嗎?

當然,發起人帶著他的事件來了,就象天氣預報員帶著他的天氣預報來了一樣.好了,相信我

人類總有一天可以制造天氣.聽著一定要相信我,出了打雷下雨等這些上帝已經預定好的天氣

我們總有一天會創造出新的天氣效果例如,下錢怎么樣?呵呵..聽上去是個不錯的想法,雖然是

個玩笑.好的,你會說我準是瘋了,干嘛說這些?不,我要談到一個新的話題.那就是用戶自定義

事件和系統預定義事件.那么下面我們來分別討論這兩種事件.


用戶自定義事件:

我相信代碼永遠都是最有說服力的.就象你不愿意去看教材而更愿意去看科教電影那樣.

下面的代碼,就是我要說明的事實.

 

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace userEvent
{
 /// <summary>
 /// Form1 的摘要說明。
 /// </summary>
 public delegate void MYShow();

 public class Form1 : System.Windows.Forms.Form
 {
  /// <summary>
  /// 必需的設計器變量。
  /// </summary>
  private System.ComponentModel.Container components = null;
        public event MYShow ShowME;
  public Form1()
  {
   //
   // Windows 窗體設計器支持所必需的
   //
   InitializeComponent();

   //
   // TODO: 在 InitializeComponent 調用后添加任何構造函數代碼
   //
                    this.ShowME();
  }

  /// <summary>
  /// 清理所有正在使用的資源。
  /// </summary>
  protected override void Dispose( bool disposing )
  {
   if( disposing )
   {
    if (components != null)
    {
     components.Dispose();
    }
   }
   base.Dispose( disposing );
  }

  #region Windows Form Designer generated code
  /// <summary>
  /// 設計器支持所需的方法 - 不要使用代碼編輯器修改
  /// 此方法的內容。
  /// </summary>
  private void InitializeComponent()
  {
   //
   // Form1
   //
   this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
   this.ClientSize = new System.Drawing.Size(292, 273);
   this.Name = "Form1";
   this.Text = "Form1";
            this.ShowME+=new MYShow(this.ShowMeName);
   
  }
  #endregion

  /// <summary>
  /// 應用程序的主入口點。
  /// </summary>
  [STAThread]
  static void Main()
  {
   Application.Run(new Form1());
  }
  void ShowMeName()
  {
   MessageBox.Show("I'm yarshray");
  }
 }
}


看見上面的代碼了嗎?不用我多說,你也猜到我要說的是什么,看我自定義的一個代理

public delegate void MYShow(); 這個代理將要代理一個事件,它是在這兒定義的

如下:public event MYShow ShowME;我定義的這個事件的名字叫做ShowME是的,人如其名

就是要展示一下我,呵呵..,看看吧,下面的一句this.ShowME+=new MYShow(this.ShowMeName);

我使用了這個事件并把ShowMeName交給了他.這個方法很簡單就是彈出一個對話框.寫上我

的名字"yarshray",可是這這個事件是在那兒觸發的呢?為什么不向上看?看見構造函數了嗎?

是的,里面有一句 this.ShowME();,可是你知道,這樣做沒有任何意義,實際情況是需要自定義

消息然后把它掉到消息循環中,然后通過消息來觸發事件.不過我只是在講有關代理和事件,所以

并沒有那么做.只為了圖簡便.讓你能夠看的更清楚.好了,用戶自定義事件我就講到這里.下面的

時間讓我們來講講預定義事件.

 

預定義事件:

實際上不用我多說,大家都用到過.講象我一開始說到的那樣,天氣預報員帶著他的天氣預報一樣

那都是上帝預先安排好的那樣,刮風下雨,下雪,冰雹等等.直接拿來使用就好了.就想一個按紐那樣

點擊.鼠標進入,鼠標移開,等等.例子我就不給了,誰都用過,


好了,我寫完了,希望對你有點幫助,當然看上去,更象一堆廢話,是嗎?那好吧,你就當成是一種

消遣.最后還是謝謝各位能夠看完.我還會寫的.就這樣,下回見.

原文轉自:http://www.anti-gravitydesign.com

評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97