2011-12-02 529 views
2

,我們可以在表單上創建的按鈕是寫在事件處理方面的Form1.Designer.cs作爲按鈕事件處理

this.button1.Click += new System.EventHandler(this.button1_Click); 

這裏Clickpublic event EventHandler的類型,這EventHandler爲代表作爲

public delegate void EventHandler(object sender, EventArgs e); 

現在,

爲什麼不能像 '='(等於)

this.button1.Click = new System.EventHandler(this.button1_Click); 

而且當我通過參數this.button1_Click,它是如何匹配到 void EventHandler(object sender, EventArgs e);委託?在這裏我有兩個論點。

請隨本清我。

謝謝

回答

1

ttSo,讓我們看到的是什麼事件。

代碼,你寫

public event EventHandler MyEvent; 

將編譯到

private EventHandler MyEvent = null; 

[MethodImp(MethodImplOptions.Synchronized)] 
public void add_MyEvent(EventHandler value) { 
    MyEvent = (EventHandler)Delegate.Combine(MyEvent, value); 
} 

[MethodImp(MethodImplOptions.Synchronized)] 
public void remove_MyEvent(EventHandler<NewMailEventArgs> value) { 
    MyEvent = (EventHandler)Delegate.Remove(MyEvent, value); 
} 

所以,你看,你不能直接訪問委託,只能撥打+ =和 - =,這是重寫事件類。 也可以通過覆蓋方法+ =和 - =來手動管理此機制。 你可以這樣說:

public event EventHandler MyEvent 
{ 
    add { //your code for += here } 
    remove { //your code for -= here } 
} 

更多有關事件,並代表你可以閱讀的書「通過C#CLR」。我在本書中發現了這一切。

+0

當然,你的第二個問題的答案是:當你做新的System.EventHandler(this.button1_Click); 您不是創建EventHandler(對象發件人,EventArgs e),只是創建與EventHandler(對象發件人,EventArgs e)具有相同參數和返回類型的方法。 – igofed

0

1 /它不能是「=」(等於),因爲委託就像一個函數指針 2 /如果你想參數傳遞給事件點擊按鈕,你必須讓自己的按鈕類,並實現點擊事件,並有你自己的EventArgs

示例代碼:

public class MyEventArg 
{ 
    int _param1; 
    string _param2; 
    //you can add more param 
    public MyEventArg(int _param1,string _param2) 
    { 
     this._param1 = _param1; 
     this._param2 = _param2; 
    } 
} 

public delegate void MyButtonClickHandler(object sender, MyEventArg e) 
public class MyButton:Control 
{ 
    public event MyButtonClickHandler OnMyClick; 
    //You can raise your event here 
protected override void OnClick(EventArgs e) 
{ 
      MyEventArg e = new MyEventArg(1,"a");//just sample data here 
      this.OnMyClick(this,e); 
    } 
} 

在包含爲myButton級即時形式

public partial class Form1 : Form 
{ 
    MyButton myButton = new MyButton(); 
    public Form1() 
    { 
     InitializeComponent(); 
     myButton.OnMyClick += new MyButtonClickHandler(this.myButton_OnMyClicked); 
    } 

    private void myButton_OnMyClicked(object sender, MyEventArg e){ 
    //your implementation   
    } 
} 
1

esentially,您要添加處理程序的情況下,不設置一個處理程序。你可能希望有更多的事件處理程序。一個處理程序不應該排除其他處理程序,因爲可能需要執行多個操作,以響應可能發生在不同類別,不同地點,不同線程和不同條件下的單個事件。 + =說讓我成爲這個事件的訂閱者(可能還有一個訂閱者)。

1

如果你想有多個方法呼籲Click事件是什麼。你在做什麼

this.button1.Click += new System.EventHandler(this.button1_Click); 

正在註冊this.button1_Click方法,當Click事件被引發時被調用。 +=添加處理程序並且不分配處理程序。

0

親愛Nagaraj Tantri,

對於問題1:如上所說,由於委派可以設置多事件。

問題2:由於culithay說,如果你想通過自定義的參數通過量事件buttion

點擊,如果你想使用事件處理程序,並通過對自定義自己的說法

你要自定義您的控制類和自定義自己的事件的說法,

自定義事件參數CustomEventArg應該繼承EventArg類。

您可以參考下面的示例代碼。

// Customs ColorChanged's event parameter.  
public class ColorChangedEventArgs : EventArgs 
{ 
    private Color color; 
    public ColorChangedEventArgs(Color c) 
    { 
     color = c; 
    } 

    public Color GetColor 
    { 
     get { return color; } 
    } 
} 


    //Add this method in your custom control 
    protected void ibtnTest_Click(object sender, ColorChangedEventArgs e) 
    { 
     //TODO; 
    } 

您也可以參照的文MSDN here