2016-11-23 90 views
0

在VB.net窗體中,我有20個按鈕。它們是從btnLoc1〜btnLoc20命名的。我不想編碼每個按鈕點擊事件。循環按鈕來檢查哪個被點擊

  1. 如何遍歷每個按鈕來檢查哪個被點擊?

  2. 我是否需要實現計時器滴答聲來聽按鈕點擊事件?

+1

_我不想編碼每個按鈕單擊event_ - 你需要。您可以爲所有按鈕創建一個按鈕單擊事件處理程序 – Fabio

+1

Private Sub Buttons_Click(ByVal sender As Object,ByVal e As System.EventArgs)Handles Button1.Click,Button2.Click,_ Button3.Click,Button4.Click,Button5.Click, Button6.Click,Button7.Click,Button8.Click'等等...... End Sub –

回答

1

如果按鈕被點擊時發現 - eventhandler是最好的選擇。
但是你可以爲所有的按鈕

Private Sub Button_Click(sender As Object, e As EventArgs) 
    Dim button As Button = DirectCast(sender, Button) 
    MessageBox($"Button '{button.Name}' was clicked") 
End Sub 

然後在構造函數中只有一個事件處理

Public Sub New() 
    InitializeComponennts() 

    AddHandler Button1.Click, AddressOf Me.Button_Click 
    AddHandler Button2.Click, AddressOf Me.Button_Click 
    AddHandler Button3.Click, AddressOf Me.Button_Click 
    ' and so on 
End Sub 

如果你想獲得每個鍵有多少點擊,只需創建字典,並添加點擊量的信息在一個事件處理程序中

Private ButtonsClickAmount As New Dictionary(Of String, Integer)() 

Private Sub Button_Click(sender As Object, e As EventArgs) 
    Dim button As Button = DirectCast(sender, Button) 
    If ButtonsClickAmount.ContainKey(button.Name) = True Then 
     ButtonsClickAmount(button.Name) += 1 
    Else 
     ButtonsClickAmount.Add(button.Name, 1) 
    End If 
End Sub 
1

您可以爲所有Buttons創建單個事件處理程序。選擇設計器中的所有按鈕,打開「屬性」窗口,單擊「事件」按鈕,然後雙擊「Click」事件。這將生成一個Click事件處理程序,就像雙擊設計器中的Button一樣,除了這個將在Handles子句中有多個項目。然後,您可以使用sender參數訪問被點擊的Button,例如

Private Sub Buttons_Click(sender As Object, e As EventArgs) Handles Button1.Click, 
                    Button2.Click, 
                    Button3.Click 
    Dim btn = DirectCast(sender, Button) 

    'Use btn here. 
End Sub 

接下來的問題是,你想用那Button做什麼?如果你想爲每個Button做一些不同的事情,那麼你真的應該創建單獨的事件處理程序。或者,您可能有一個數據列表,並且您想要使用該列表中對應於被點擊的Button的項目。有很多方法可以做到這一點。一種是將數據放在Button本身的Tag屬性中,並從那裏檢索它。另一個是使用併發索引,例如

Dim buttons = Controls.OfType(Of Button)().ToArray() 
Dim data = {"First", "Second", "Third"} 

MessageBox.Show(data(buttons.IndexOf(btn))) 

顯然你需要確保Button陣列和數據陣列排隊。

+0

如果每個按鈕都有自己的邏輯 - 每個按鈕的自己的處理程序都是更清晰且更容易維護的出價,那麼「索引「,」映射「方法 – Fabio

+0

@Fabio,是的,我已經在我的回答中說過,如果您想爲每個」按鈕「做不同的事情,應該使用單獨的事件處理程序。儘管我的第二個代碼片段沒有爲每個「Button」演示不同的邏輯。它爲每個'Button'演示不同的數據,所有的邏輯都是相同的。在這種情況下,使用併發數組是一種優越的方法,因爲它遵循DRY原則。 – jmcilhinney