2016-11-15 22 views
0

我正在製作一個音樂程序,使用戶可以在文本框中輸入數字並在容器內創建多個按鈕。我希望每個創建的按鈕都被命名爲'btn',然後是循環中生成的數字。以下是我到目前爲止的代碼:如何從VB.NET中的字符串創建窗口小部件名稱?

Private Sub txtNum_TextChanged(sender As Object, e As EventArgs) Handles txtNum.TextChanged 
    For i As Integer = 1 To CInt(txtNum) 
     Dim strName as String = "btn" & i.ToString() 
     Dim <strName> as New Button 
    Next 
End Sub 

我知道我的代碼中正在創建按鈕的那一行不起作用。我怎樣才能做到這一點?有沒有另一種方式,我可以在VB.NET中實現這一點?

回答

0

您應該設置一個按鈕的名稱屬性,但我認爲你應該避免使用TextChanged事件去做這個。每次在文本框中鍵入單個字符時,都會調用此處理程序(當用戶輸錯某些內容並取消其輸入以修復錯誤時),因此最好有一個創建按鈕,單擊事件可處理任務

Private Sub bntCreate_Click(sender As Object, e As EventArgs) Handles btnCreate.Click 
    For i As Integer = 1 To CInt(txtNum.Text) 
     Dim strName as String = "btn" & i.ToString() 
     Dim btn as New Button 
     btn.Name = strName 

     ' Now calculate the Location property to place your button 
     btn.Location = new Point(0, i * 20) 

     ' Set the button click handler (same handler for all buttons) 
     AddHandler btn.Click, AddressOf onClick 

     ' And finally add it to the form controls collection. 
     Me.Controls.Add(btn) 
    Next 
End Sub 

Sub onClick(ByVal sender as Object, ByVal args as EventArgs) 
    Dim btn = DirectCast(sender, Button) 
    if btn.Name = "btn1" Then 
     ' Code for btn1 
    else if btn.Name = "btn2" Then 
    ..... 
    End If 
End Sub 

棘手的部分是如何將按鈕放在窗體上。在上面的示例中,按鈕位於垂直佈局中,頂部位置之間的間距爲20像素,但這會導致其他問題(按鈕可以放在窗體邊框外)。如果按鈕的數量很高,那麼您應該嘗試使用FlowLayoutPanel,讓它們根據FlowLayout設置

+0

...或在[TableLayoutPanel]中自動排列,如[本答案](http:///stackoverflow.com/a/40508373/2882256) –

+0

每個按鈕創建時,是否可以爲每個按鈕創建一個處理程序? – Tij

+0

是的,您可以將每個按鈕設置爲相同的處理程序,然後使用處理程序內的Name屬性來區分按鈕 – Steve

0

您必須將按鈕添加到您的窗體的控制,並創建一個事件處理

> Private Sub txtNum_TextChanged(sender As Object, e As EventArgs) 
> Handles txtNum.TextChanged 
>  For i As Integer = 1 To CInt(txtNum) 
>   Dim strName as String = "btn" & i.ToString() 
>   Dim btn as New button 
>  With btn 
>  .Size = (100,20) 
>  .Location = (20,20) 
>  End With 
>  AddHandler btn.Clicked, AddressOf btn_Clicked 
>  MyForm.Controls.Add(btn) 
>  Next 
> End Sub 
相關問題