2012-07-03 11 views
13

Visual Basic 2010 Express Editionのインベントリを作成しています。私は在庫に必要なフィールドの数を知らない。私の希望は、プログラムのforループを使ってテキストボックス/チェックボックス/ボタンを追加できるということでした。ツールボックスを使わずにフォームにコントロールを追加する方法はありますか?VB.netのフォームにプログラムでコントロールを追加する方法

コントロールをプログラムでインスタンス化して追加できますか?

答えて

15

はい。

Private Sub MyForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Dim MyTextbox as New Textbox 
    With MyTextbox 
     .Size = (100,20) 
     .Location = (20,20) 
    End With 
    AddHandler MyTextbox.TextChanged, AddressOf MyTextbox_TextChanged 
    MyForm.Controls.Add(MyTextbox) 
End Sub 

Friend Sub MyTextbox_Changed(sender as Object, e as EventArgs) 
    'Write code here. 
End Sub 
+3

いくつかの説明を追加してください。 –

+0

こんにちは、Holger、これをパネルに追加できますか? –

+0

はいできます。すべてのコントロールには、コントロールを追加(または削除)できるコントロールプロパティがあります。実装したいハンドラを手動で追加してください。パネルの場合は、上の例の「MyForm」をパネル名に置き換えます。 –

7
Dim numberOfButtons As Integer 
Dim buttons() as Button 

Private Sub MyForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Redim buttons(numberOfbuttons) 
    for counter as integer = 0 to numberOfbuttons 
     With buttons(counter) 
      .Size = (10, 10) 
      .Visible = False 
      .Location = (55, 33 + counter*13) 
      .Text = "Button "+(counter+1).ToString ' or some name from an array you pass from main 
      'any other property 
     End With 
     ' 
    next 
End Sub 

あなたは情報を持っているテキストボックスのどのチェックするために、またはクリックされたラジオボタン、[OK]ボタンでループを繰り返し処理することができますしたい場合。

次の個々の配列の項目をクリックして、それらがイベントに応答する必要があり、のForm_Loadループに追加できるようにしたい場合:

AddHandler buttons(counter).Clicked AddressOf All_Buttons_Clicked 

その後、作成

Private Sub All_Buttons_Clicked(ByVal sender As System.Object, ByVal e As System.EventArgs) 
    'some code here, can check to see which checkbox was changed, which button was clicked, by number or text 
End Sub 

お電話: objectYouCall.numberOfButtons = initial_value_from_main_program

response_yes_or_no_or_other = objectYouCall.ShowDialog() 

ラジオボタン、テキストボックス、同じストーリーは異なるエンディング。

2

コントロールをフォームに動的に追加するには、次のコードを実行します。ここでは、動的に追加するテキストボックスコントロールを作成しています。

Public Class Form1 
    Private m_TextBoxes() As TextBox = {} 

    Private Sub Button1_Click(ByVal sender As System.Object, _ 
           ByVal e As System.EventArgs) _ 
           Handles Button1.Click 

     ' Get the index for the new control. 
     Dim i As Integer = m_TextBoxes.Length 

     ' Make room. 
     ReDim Preserve m_TextBoxes(i) 

     ' Create and initialize the control. 
     m_TextBoxes(i) = New TextBox 
     With m_TextBoxes(i) 
      .Name = "TextBox" & i.ToString() 
      If m_TextBoxes.Length < 2 Then 
       ' Position the first one. 
       .SetBounds(8, 8, 100, 20) 
      Else 
       ' Position subsequent controls. 
       .Left = m_TextBoxes(i - 1).Left 
       .Top = m_TextBoxes(i - 1).Top + m_TextBoxes(i - _ 
        1).Height + 4 
       .Size = m_TextBoxes(i - 1).Size 
      End If 

      ' Save the control's index in the Tag property. 
      ' (Or you can get this from the Name.) 
      .Tag = i 
     End With 

     ' Give the control an event handler. 
     AddHandler m_TextBoxes(i).TextChanged, AddressOf TextBox_TextChanged 

     ' Add the control to the form. 
     Me.Controls.Add(m_TextBoxes(i)) 
    End Sub 

    'When you enter text in one of the TextBoxes, the TextBox_TextChanged event 
    'handler displays the control's name and its current text. 
    Private Sub TextBox_TextChanged(ByVal sender As _ 
    System.Object, ByVal e As System.EventArgs) 
     ' Display the current text. 
     Dim txt As TextBox = DirectCast(sender, TextBox) 
     Debug.WriteLine(txt.Name & ": [" & txt.Text & "]") 
    End Sub 
End Class 
+0

その他の回答が実際にコードを説明する方法に注目してください。 –

+0

フォームを許可している場合、これらを 'FlowLayoutPanel'に追加するか、' DataGridView'に動的にセルを追加します。そうすれば、境界や正確な場所を設定する必要はありません。いい例。 – Rachael

6
Public Class Form1 
    Private boxes(5) As TextBox 

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
     Dim newbox As TextBox 
     For i As Integer = 1 To 5 'Create a new textbox and set its properties26.27. 
     newbox = New TextBox 
     newbox.Size = New Drawing.Size(100, 20) 
     newbox.Location = New Point(10, 10 + 25 * (i - 1)) 
     newbox.Name = "TextBox" & i 
     newbox.Text = newbox.Name 'Connect it to a handler, save a reference to the array & add it to the form control. 
     AddHandler newbox.TextChanged, AddressOf TextBox_TextChanged 
     boxes(i) = newbox 
     Me.Controls.Add(newbox) 
     Next 
    End Sub 

    Private Sub TextBox_TextChanged(sender As System.Object, e As System.EventArgs) 
     'When you modify the contents of any textbox, the name of that textbox 
     'and its current contents will be displayed in the title bar 

     Dim box As TextBox = DirectCast(sender, TextBox) 
     Me.Text = box.Name & ": " & box.Text 
    End Sub 
End Class 
関連する問題