我目前有一個窗體上有大約13個按鈕。檢查窗體上的按鈕單擊事件 - C#
我希望能夠執行一個功能,當其中一個按鈕被點擊。但我試圖阻止13個不同的按鈕點擊事件。
有沒有辦法讓我能夠確定什麼時候點擊任何按鈕事件被觸發,並且能夠判斷哪個按鈕被觸發了?
謝謝!
我目前有一個窗體上有大約13個按鈕。檢查窗體上的按鈕單擊事件 - C#
我希望能夠執行一個功能,當其中一個按鈕被點擊。但我試圖阻止13個不同的按鈕點擊事件。
有沒有辦法讓我能夠確定什麼時候點擊任何按鈕事件被觸發,並且能夠判斷哪個按鈕被觸發了?
謝謝!
你可以有不同的按鈕點擊處理程序,並根據按鈕操作命名它們,也可以爲它們全部設置單個事件處理程序,在這種情況下,可以將參數sender
轉換爲按鈕,例如通過它的名稱,查找相關按鈕。
但我提供如果你有類似的按鈕組的行爲映射到一個單一的功能,但如果行動是不同的使用不同的方法更好,但在所有的形式與13按鈕不好,你可以改變它們菜單,標籤,...
回調函數的第一個參數是被按下的按鈕。
有一個函數可以處理所有的點擊事件,並使用「發件人」對象的屬性來標識特定的按鈕。
foreach (Control ctl in this.Controls)
{
if (ctl is Button)
(ctl as Button).Click += MyButtonHandler;
}
protected void MyButtonHandler(object sender, EventArgs e)
{
Button clickedButton = sender as Button;
//...
}
private void OnButtonClicked(object sender, EventArgs e){
Button oButton = sender as Button;
if (oButton != null){
// your logic goes here !
}
}
oButton變量是當前的按鈕。 (重要如果oButton != null
使用as
操作時檢查)上的你到了發件人參考click事件
- 這是點擊按鈕,以便裏面,你可以測試基礎上的內容或標籤和行爲值:
private void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show((sender as Button).Tag.ToString());
}
我認爲在這種情況下使用delgates將是適當的。查看這些鏈接瞭解實施的進一步信息。
每一個適當的事件處理程序都有一個對象發送參數。通過在「屬性」窗口的OnClick事件中輸入相同的名稱,爲所有13個按鈕提供相同的處理程序,例如:OnAnyButtonClicked。所創建的功能將是:
private void OnAnyButtonClicked(object sender, ...)
{
// sender is the button that was clicked,
// find out which button is clicked
// call the corresponding function
}
提示:
要找出被按下,你可以使用Object.ReferenceEquals 一個更快的方式,以避免如果...然後...按鈕,否則如果...然後...其他...如果... 正在使用每個Button的Tag屬性。 給每個Button.Tag一個與必須執行的動作相對應的枚舉值,並使用switch語句來找出必須完成的操作。
你也可以指派一個委託給button.Tag,但這與爲每個按鈕製作不同的onClick事件處理程序幾乎相同。
作爲一名程序員,他被迫接管了其他人編寫的許多應用程序:如果我繼承了一個帶有13個按鈕的表單,每個表單都有自己的點擊事件處理程序,我會很高興,因爲這將是完全的正常和預期。相反,如果我遇到了一些本地系統,其中有13個按鈕連接到一個點擊事件處理程序,其中一個case語句根據發件人按鈕的文本確定要執行哪個操作,我會很不高興。 – MusiGenesis
我同意你的意見。但是我正在寫卡片遊戲,我正在從不同類型的卡片組中選擇卡片遊戲。所有的事件都調用相同的功能,我發現沒有必要讓13個按鈕點擊事件都調用相同的功能。 – Johnrad
是的,這是不同的,完全有效的。如果所有的按鈕都調用完全相同的代碼(並且沒有可怕的case語句),那麼將一個事件處理程序分配給所有按鈕不僅可以,而且更可取。 – MusiGenesis