2013-08-04 110 views
0

這又是我,試着不要這麼快就煩你們這些傢伙,但我有一個問題... SSSS ... ... ...C#如何處理多個按鈕點擊事件?

好了,所以,當我創建的應用程序有多個按鈕,我通常通過爲每個按鈕分配相同的事件處理程序來處理它們的點擊事件。我給他們他們獨特的名字或標籤,然後用switch-case循環,使用他們的名字或標籤給他們分配他們的工作,職責,使命,無效,你知道......所以,在我的代碼中看起來像這樣:

private void button_Click(object sender, EventArgs e) 
    { 
     Button B = (Button)sender; 
     switch (B.Name) 
     { 
      case "START": optionStart(); break; 
      case "LOAD": optionLoad(); break; 
      case "EXIT1": Application.Exit(); break; 
      case "EXIT2": backToMainMenu(); break; 
     } 
    } 

我這裏面臨幾個問題: 1.使用我的「技術」這整個事情是相當混亂,當你達到約20-30按鈕。 2.相同名稱的按鈕必須處理不同,所以我給他們命名通常EXIT1,EXIT2,EXIT3女巫讓我失去它後幾個更多的退出...

所以,任何人有一個替代的建議或解決方案或可能一些指​​南?我是一個無恥的人,我會接受任何東西! (只是開玩笑......我不接受美國運通卡)

+3

而是每個Button.Click事件掛鉤到相同的事件處理程序 - 創建一個事件處理程序*每個*按鈕。如果你的按鈕名稱很好,那就是,它們是自我記錄的 - 你的代碼將變得更具可讀性。 –

+0

這是一個很好的建議...我會嘗試一下:) –

回答

2

如何使用字典。註冊您希望運行的方法,然後註冊到您的處理程序中 - 只需查看並使用它即可。

一個例子(爲了簡化處理無差錯) -

初始化由:由

private void button_Click(object sender, EventArgs e) 
    { 
     m_clickHandler[sender as Button].Invoke(); 
    } 

另一種方式

m_clickHandler = new Dictionary<Button, Action>(); 
m_clickHandler.add(startButton, optionStart); 

句柄是使用Lambda表達式。您可以將事件直接與您希望運行的事件掛鉤。這將爲您節省通常得到的醜陋參數處理程序。

button1.Click += (a,b) => Foo(); 
+1

我一直沒有使用它,只是因爲我沒有意識到它,謝謝你的信息,我仍然在閱讀一個編程書,我還沒有達到那個部分: ) –

+0

編碼是學習如何編碼的最好也是唯一的方法:)順便說一下,您應該選擇最適合您需要的答案(keyboardP或我的 - 並接受它)。 – Vadim

+0

我意識到這一點,只是我認爲這有點太早,也許我會有更多的選擇,誰知道,如果在一兩天內什麼都沒有出現,我會選擇,不要擔心我不要忘記在這裏;) –

1

您仍然必須鍵入操作,但這可能會使您更容易維護。

Dictionary<string, Action> actionDict = new Dictionary<string, Action>(); 
          { 
          { "START", optionStart}, 
          { "LOAD", optionLoad}, 
          { "EXIT1",() => { Application.Exit(); }}, 
          { "EXIT2", backToMainMenu } 
          }; 

private void button_Click(object sender, EventArgs e) 
{ 
    Button B = (Button)sender; 
    if(B != null) 
    { 
     Action methodToCall = null; 
     if (actionDict.TryGetValue(B.Name, out methodToCall)) 
     { 
      methodToCall(); 
     } 
    } 
} 

然後,您可以輕鬆地添加或從字典中刪除,而無需修改switch語句。

或者,您可以在按鈕的Tag屬性中存儲操作並調用該操作。 (雖然,正如評論中提到的,這是不可擴展的,你可以添加一個List,但這會變得混亂,我不會推薦它)。

但是,總的來說,爲什麼你有這麼多的退出選項?您似乎可以重新設計屏幕流,以更好地適應多種退出方式。

+0

集合初始化器在這裏會相當不錯:-) –

+0

我想過使用標籤,但我認爲它有一個嚴重的可擴展性問題。如果他想處理更多事件會發生什麼? – Vadim

+0

是的,標籤選項對於一般用途來說並不是最理想的。 – keyboardP

1

我有一個解決方法,你..你可以設置

int Type1 = 1; 
int Type2 = 2; 
button1.tag = Type1; 
button2.tag = Type2; 
button3.tag = Type1; 

事件

Button B = (Button)sender; 
     switch ((int)B.Tag) 
     { 
      case 1: optionStart(); break; 
      case 2: optionLoad(); break; 
      case 3: Application.Exit(); break; 
      case 4: backToMainMenu(); break; 
     } 
相關問題