2017-01-09 189 views
0

在visual basic中,我希望能夠使用存儲在變量中的數字訪問按鈕的名稱。 例如,如果我有24個按鈕,它們都被命名爲'按鈕',其後面的數字爲1,2,3 ... 22,23,24。如果我想改變前八個按鈕中的文字,我會怎麼做。使用變量訪問按鈕名稱

這裏是我的例子來幫助說明我的意思:

For i = 1 to 8 
     Button(i).text = "Hello" 
    Next 
+0

的可能的複製[如何創建VB .NET控件數組(HTTP:/ /stackoverflow.com/questions/5299435/how-to-create-control-arrays-in-vb-net) – Jaxedin

+0

檢查[此答案](http://stackoverflow.com/a/41412984/4934172) –

回答

0
For index As Integer = 1 To 8 
    CType(Me.Controls("Button" & index.ToString().Trim()),Button).Text = "Hello" 
Next 
0

使用LINQ,你是好去:

Dim yourButtonArray = yourForm.Controls.OfType(of Button).ToArray 
' takes all controls whose Type is Button 
For each button in yourButtonArray.Take(8) 
    button.Text = "Hello" 
Next 

或者

Dim yourButtonArray = yourForm.Controls.Cast(of Control).Where(
    Function(b) b.Name.StartsWith("Button") 
    ).ToArray 
' takes all controls whose name starts with "Button" regardless of its type 
For each button in yourButtonArray.Take(8) 
    button.Text = "Hello" 
Next 

在任何情況下, .Take(8)將重複存儲在裏面的前8個項目yourButtonArray

我希望它有幫助。

1

提出的解決方案,如果按鈕沒有直接包含由窗體本身到目前爲止將會失敗。如果他們在不同的容器中呢?例如,您可以簡單地將「我」更改爲「面板1」,但如果按鈕分佈在多個容器多個容器上,則不起作用。

要使其工作,無論是按鍵位置,使用Controls.Find()方法與「searchAllChildren」選項:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim ctlName As String 
    Dim matches() As Control 
    For i As Integer = 1 To 8 
     ctlName = "Button" & i 
     matches = Me.Controls.Find(ctlName, True) 
     If matches.Length > 0 AndAlso TypeOf matches(0) Is Button Then 
      Dim btn As Button = DirectCast(matches(0), Button) 
      btn.Text = "Hello #" & i 
     End If 
    Next 
End Sub