2010-04-01 162 views
24

我想創建一個方法,將事件作爲參數,並添加eventHandler來正確處理它。就像這樣:如何將事件傳遞給方法?

我有兩個事件:

public event EventHandler Click; 
public event EventHandler Click2; 

現在我想以一個特定的事件傳遞給我的方法是這樣的(僞):

public AttachToHandleEvent(EventHandler MyEvent) 
{ 
    MyEvent += Item_Click; 
} 

private void Item_Click(object sender, EventArgs e) 
{ 
    MessageBox.Show("lalala"); 
} 

ToolStripMenuItem tool = new ToolStripMenuItem(); 
AttachToHandleEvent(tool.Click); 

這可能嗎?

我注意到這段代碼工作正常,並返回到我的項目中,並注意到當我傳遞一個在我的類中聲明的事件時,它可以工作,但是當我從其他類傳遞事件時,它仍然不起作用。

我得到的是這樣的錯誤:

The event 'System.Windows.Forms.ToolStripItem.Click' can only appear on the left hand side of += or -=

+0

@OJ是的,你太聰明瞭! – 2010-04-01 12:43:02

+0

@Petar Minchev我不知道爲什麼......你是第一個幫助我的人。謝謝。 – 2010-04-01 12:44:04

+0

我已更新問題以反映我處理的問題 – 2010-04-01 12:51:10

回答

23

我原來的答覆是適合從定義事件類中,但你既然更新您的問題,以反映您希望從定義類之外的做到這一點,所以我認爲欲絕。

只有定義了一個事件可以指隱含委託變量,所述事件使用的類。從該課程以外,您只能通過+=-=訪問addremove方法。這意味着你不能直接做你正在問的東西。但是,您可以使用功能性方法。

class A{ 
    public event EventHandler Event1; 

    public void TriggerEvent1(){ 
     if(Event1 != null) 
      Event1(this, EventArgs.Empty); 
    } 
} 

class B{ 
    static void HandleEvent(object o, EventArgs e){ 
     Console.WriteLine("Woo-hoo!"); 
    } 

    static void AttachToEvent(Action<EventHandler> attach){ 
     attach(HandleEvent); 
    } 

    static void Main(){ 
     A a = new A(); 
     AttachToEvent(handler=>a.Event1 += handler); 
     a.TriggerEvent1(); 
    } 
} 
+0

我已經檢查過我的問題的更新版本,不幸的是它不起作用,你能幫我嗎? – 2010-04-01 12:52:21

+0

我試過這種方法,它工作。 – hakan 2014-07-22 16:27:39

2

只要寫tool.Click += Item_Click;

編輯:從MSDN「事件只能從類或者他們(它)的聲明結構中調用」。所以你試圖做的是不可能的。你能詳細說明你的需求嗎?爲什麼你想要傳遞一個事件作爲參數?

+0

哦..所以我的代碼在別處不好。謝謝! – 2010-04-01 12:38:08

+1

它不是我的減數。你的回答是第一個,也是正確的。我試過這段代碼的更長版本,它不想工作。我在這裏寫了這個問題來尋求幫助,但是當你回答時,我已經從這裏重新檢查了這個簡單的例子,它在你寫的時候是正確的。謝謝 。 – 2010-04-01 12:41:15

+1

仍然有問題。對不起,這是價格,並專注於當我有一個錯誤的情況下 – 2010-04-01 12:53:08

3

這是不可能的。如果符合您的需求,您可以使用委託而不是事件。

1
delegate void doIt(object sender, object data); 
    event doIt OnDoIt; 

    void add(doIt theDel) 
    { 
     OnDoIt += theDel; 
    } 

    void doIt1(object a, object b) 
    { 
    } 

    void doIt2(object a, object b) 
    { 
    } 

    void add() 
    { 
     add(doIt1); 
     add(doIt2); 
    } 
5

我做了這樣的:

public AttachToHandleEvent(Object obj, string EventName) 
{ 
    EventInfo mfi = obj.GetType().GetEvent(EventName); 
    MethodInfo mobj = mfi.GetAddMethod(); 
    mobj.Invoke(obj, new object[] { Item_Click}); 
} 

private void Item_Click(object sender, EventArgs e) 
{ 
    MessageBox.Show("lalala"); 
} 

ToolStripMenuItem tool = new ToolStripMenuItem(); 
AttachToHandleEvent(tool "Click"); 

謝謝大家的意見。沒有你的幫助,這個解決方案是無法完成的。

+0

這段代碼有一些問題。有一個解決方案是在這裏:http://msdn.microsoft.com/en-us/library/ms228976%28v=vs.95%29.aspx#Y899 – cbp 2011-06-15 05:36:16

-1

你的問題建議你有一些機制錯誤: 你不可錯過的活動!

你最想傳遞一個函數作爲參數,因此調用方法將調用在某些時候,其他方法。用技術術語來說,這是一個代表。我建議使用已定義的Action類。下面是一個例子片斷:

void MyFunction (string otherArguments, Action onFinished){ 
    ... 
    if (onFinished != null) 
     onFinished.Invoke(); 
} 

關於這樣做的好處是,調用MyFunction的時候可以使用內聯語法申報操作:

MyFunction("my other argument",()=>{ 
    ///do stuff here, which will be execuded when the action is invoked 
});