2009-04-26 74 views
7

如果actions是一個Panel,我可以提高其父項的Click事件嗎? 我目前有此代碼,但Click事件不是一種方法,所以此代碼無效。
有誰知道我可以做到這一點?在C#中提高外部對象的事件

actions.Click += delegate(object Sender, EventArgs e) 
{ 
    ((Panel)Sender).Parent.Click(); 
} 

回答

9

這是不可能提出一個C#event直接從另一class(即使是public)。您可以提供一種方法(具有足夠的訪問修飾符),以您的名義提出event,並在其他class中調用該方法。

順便說一句,這是可能的反思,但我認爲這是一個骯髒的黑客。

+0

我可以創建一個新的面板類繼承舊的一個事件,然後添加,以提高Click事件的方法? – 2009-04-26 07:11:59

+0

是的。你應該這樣做。 – 2009-04-26 07:14:17

1

根據您使用可能的框架,您不必手動調用父級上的單擊事件,例如WPFASP.NET,例如在元素樹上向上冒泡事件。

如果這不是一個選項,你可以像Mehrdad建議的那樣做。

6

引發事件的CLR中的大多數類型都有一個受保護的[EventName]方法來處理引發事件。您可以調用「從外面」使用這種思考方法保護:

Control parent = ((Control)sender).Parent; 
Type parentType = parent.GetType(); 
MethodInfo onClickMethod = parentType.GetMethod("OnClick", BindingFlags.Instance | BindingFlags.NonPublic); 

onClickMethod.Invoke(parent, new object[] { e }); 
1

我能想到的,你爲什麼會想提高Click事件是,如果你是模擬用戶輸入的唯一原因。你正在研究一個自動化的測試驅動程序或類似的東西嗎?如果是這樣,可能會有更好的解決方案,而不是僅使用僅測試輔助方法玷污代碼。 This在谷歌首先出現,我不知道如果它是好的。

如果你想在應用程序本身中將它作爲一種流控制,我會退後一步,看看這是否是正確的做法 - 它有點「不好」 。

2

我實現此使用反射和擴展方法,使得我可以調用(在這種情況下)將LinkLabel點擊事件通過只調用:

var link = new LinkLabel()' 
link.Text = "Some link"; 
link.click(); 

點擊()方法是一個C#擴展方法:

public static void click(this LinkLabel linkLabel) 
{ 
    var e = new LinkLabelLinkClickedEventArgs((LinkLabel.Link)(linkLabel.prop("FocusLink"))); 
    linkLabel.invoke("OnLinkClicked", e); 
} 

它採用另一種擴展方法:

  • 從LinkLa獲得私有財產貝爾(需要創建LinkLabelLinkClickedEventArgs對象)
  • 調用OnLinkClicked方法(這將觸發