2012-07-03 23 views
13

Estoy trabajando en un inventario en Visual Basic 2010 Express Edition. No sé la cantidad de campos que serán necesarios para el inventario. Mi esperanza era poder agregar cuadros de texto/casillas de verificación/botones usando ciclos for en el programa. ¿Hay alguna manera de agregar controles a un formulario sin usar la caja de herramientas?Cómo agregar controles mediante programación a un formulario en VB.NET

¿Puedo agregar controles instalándolos en el programa?

Respuesta

15

Sí.

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

Por favor, añadir un poco de explicación. –

+0

Hola, Holger, ¿puedo agregar esto en un panel? –

+0

Sí, puedes. Cada control tiene una propiedad de controles a la que puede agregar (o eliminar) controles. Simplemente recuerde agregar manualmente cualquier controlador que desee implementar. Para su panel, reemplace "MyForm" en mi ejemplo anterior con el nombre de su panel. –

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 

Si desea comprobar cuál de los cuadros de texto tienen información, o qué botón se hizo clic, puede iterar a través de un bucle en un botón Aceptar.

Si usted quiere ser capaz de hacer clic elementos de matriz individuales y hacer que responden a eventos, añadir en el bucle Form_load lo siguiente:

AddHandler buttons(counter).Clicked AddressOf All_Buttons_Clicked 

luego crear

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 

cuando llame: objectYouCall.numberOfButtons = initial_value_from_main_program

response_yes_or_no_or_other = objectYouCall.ShowDialog() 

Para botones de opción, cuadros de texto, misma historia, diferenciar finalización.

2

Para agregar controles dinámicamente al formulario, realice el siguiente código. Aquí estamos creando controles de cuadro de texto para agregar dinámicamente.

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

Observe cómo las otras respuestas realmente explican su código? –

+0

Agregaría esto a un 'FlowLayoutPanel' o dinámicamente agregaría células a' DataGridView', si el formulario lo permite. De esta forma no hay necesidad de establecer límites o ubicaciones exactas. Buen ejemplo. – 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 
Cuestiones relacionadas