2012-08-29 118 views
17

假設我有一個WinFoms項目。只有一個按鈕(例如button1)。以編程方式觸發控件的事件

現在的問題是:是否有可能通過代碼觸發ButtonClicked事件而沒有真正點擊它?

+2

因爲這個問題仍然存在(我甚至有一些聲譽:)),我想在這裏放一個小小的警告:如果你認爲你需要在你的代碼中做這樣的事情比幾乎確定你做錯了什麼。我也是如此。你可能有一些不好的設計,你最好花一些時間,重新考慮你在做什麼,爲什麼。 – steavy

+0

我真的認爲這是一個相關的問題,我想創建一個彈出式菜單,通常包括工具欄中的所有項目以及上下文菜單已經有的,itsme86提到的PerformClick方法幫助:-) – s1cart3r

回答

29

按鈕控件有一個可以調用的PerformClick()方法。

button1.PerformClick(); 
+0

這很適合點擊,但如果我需要另一個事件呢? – steavy

+2

通常,您只需手動調用您的事件處理程序。例如:button1_Shown(button1,EventArgs.Empty); – itsme86

9

您只需直接調用事件處理函數和對參數指定null發件人和EventArgs.Empty

void ButtonClicked(object sender, EventArgs e) 
{ 
    // do stuff 
} 

// Somewhere else in your code: 
button1.Click += new EventHandler(ButtonClicked); 

// call the event handler directly: 
ButtonClicked(button1, EventArgs.Empty); 

或者說,你會移動的邏輯出了ButtonClicked事件到其自身的功能,然後你的事件處理程序,你有其它的代碼將依次調用新的功能。

void StuffThatHappensOnButtonClick() 
{ 
    // do stuff 
} 

void ButtonClicked(object sender, EventArgs e) 
{ 
    StuffThatHappensOnButtonClick(); 
} 

// Somewhere else in your code: 
button1.Click += new EventHandler(ButtonClicked); 

// Simulate the button click: 
StuffThatHappensOnButtonClick(); 

後一種方法的優點是可以讓您將業務和UI邏輯分開。你真的不應該在你的控件事件處理程序中擁有任何業務邏輯。

1
button1.PerformClick(); 

但是,如果你必須做這樣的事情,最好是將新事件下的代碼移到新的方法上?

4

是的,只需調用方法就可以調用任何其他方法。例如:

private void btnSayHello_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("Hello World!"); 
    } 

    private void btnTriggerHello_Click(object sender, EventArgs e) 
    { 
     btnSayHello_Click(null, null); 
    } 
+2

我不需要調用處理程序方法。我需要觸發事件。處理程序在觸發事件後被調用。 – steavy

17

在.NET框架使用模式,其中對於每一個事件X有一種方法protected void OnX(EventArgs e) {}該引發事件X。看到這個Msdn article。要從聲明類外部引發事件,您必須派生類並添加公共包裝方法。在Button的情況下,它應該是這樣的:

class MyButton : System.Windows.Forms.Button 
{ 

    public void ProgrammaticClick(EventArgs e) 
    { 
     base.OnClick(e); 
    } 

} 
0

使用一個for循環調用button_click事件

private void btnadd_Click(object sender, RoutedEventArgs e) 
{ 
    for (int i = 0; i <= 2; i++) 
     StuffThatHappensOnButtonClick(); 
} 


void StuffThatHappensOnButtonClick() 
{ 
    ........do stuff 
} 

我們假設至少一次,你需要點擊按鈕

+2

來吧!這究竟與這個問題有關? – chouaib

1

爲什麼你不只是把你的事件代碼放入一個方法。然後讓事件執行該方法。這樣,如果您需要執行事件上升的相同代碼,您可以,但只需調用「方法」即可。

void Event_Method() 
{ 
    //Put Event code here. 
    MessageBox.Show("Hello!"); 
} 

void _btnSend_Click(object sender, EventArgs e) 
{ 
    Event_Method(); 
} 

void AnotherMethod() 
{ 
    Event_Method(); 
} 

有意義嗎?現在,「點擊」事件和代碼中的任何地方都可以觸發與「點擊」事件相同的代碼。

不要觸發事件,調用事件調用的方法。 ;)

相關問題