Dynamische Textboxen erstellen und füllen

  • VB.NET

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von Opelig.

    Dynamische Textboxen erstellen und füllen

    Hallöchen,

    ich versuche derzeit eine Form zu erstellen welche Dynamisch Textboxen erstellt und diese Füllt.

    Vorneweg: ich habe eine Form, in dieser sind einige Elemente wie Textboxen etc. Hierzu kommt eine Weitere Form welche per Hotkey aufgerufen wird. In der 2. Form sollen alle Steuerlemente der ersten form in Textboxen aufgelistet werden.

    jemand ne Idee wie ich das am Besten umsetze? Habe jetzt schon viel versucht, gelesen, gebastelt. Aber ich bekomm nur hin das eine Textbox erscheint in der Steht aber nichts drinne.

    Thx 4 Help
    Du musst einfach alle Controls in Form1 durchgehen (For each-Schleife),
    und dann Textboxen erstelllen:

    Dim txtTextbox As New Textbox
    txt.Textbox.Name = ...
    'Hier noch Text, Location,... setzen
    Form2.Controls.Add(txtTextbox)

    Um dann auf eine Textbox zuzugreifen:
    Dim txtTextbox As Textbox = Form2.Controls("txtTextbox1")

    Gruss
    sandiro

    sandiro schrieb:

    VB.NET-Quellcode

    1. Form2.Controls.Add(txtTextbox)
    2. '...
    3. Dim txtTextbox As Textbox = Form2.Controls("txtTextbox1")
    Das wird nicht funktionieren, da Du über eine Instanz, nicht aber einen Klassennamen an die Textbox kommst.

    VB.NET-Quellcode

    1. Dim frm As New Form2
    2. frm.Controls.Add(txtTextbox)
    3. Dim txtTextbox As Textbox = frm.Controls("txtTextbox1")
    oder besser direkt in der Klasse Form2

    VB.NET-Quellcode

    1. Me.Controls.Add(txtTextbox)
    2. Dim txtTextbox As Textbox = Me.Controls("txtTextbox1")
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ich habe bisher folgenden Code

    VB.NET-Quellcode

    1. Public Class Ettel_2
    2. Dim TB As TextBox
    3. Private Sub Ettel_2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load, MyBase.VisibleChanged, MyBase.Validated, MyBase.TextChanged, MyBase.SystemColorsChanged, MyBase.StyleChanged, MyBase.SizeChanged, MyBase.Shown, MyBase.Enter, MyBase.EnabledChanged
    4. Me.Size = New Size(150, 150)
    5. Me.MinimumSize = Me.Size
    6. 'CreateControls()
    7. 'cTBadd()
    8. Me.Controls.Add(TB)
    9. Dim TBX As TextBox = Me.Controls("txtTextbox1")
    10. End Sub
    11. 'Private Sub CreateControls()
    12. ' ' Textbox erstellen
    13. ' TB = New TextBox
    14. ' With TB
    15. ' .Font = New Font("Arial", 12)
    16. ' .SetBounds _
    17. ' (10, 10, _
    18. ' Me.ClientSize.Width - 20, _
    19. ' Me.ClientSize.Height - 20)
    20. ' .Name = "TextBox1"
    21. ' .Text = .Name
    22. ' .Anchor = _
    23. ' AnchorStyles.Left Or _
    24. ' AnchorStyles.Top Or _
    25. ' AnchorStyles.Right
    26. ' End With
    27. ' Me.Controls.Add(TB)
    28. 'End Sub
    29. 'Private Sub cTBadd()
    30. ' For Each ctrl As Control In frm_Ettel_Test.Controls
    31. ' CreateControls()
    32. ' Next
    33. 'End Sub
    34. Public Sub TranslateForm(ByRef frm As Form)
    35. For Each cntrl As Control In frm_Ettel_Test.Controls
    36. Me.TranslateForm(cntrl)
    37. Next
    38. End Sub
    39. 'Public Sub markit()
    40. ' InitializeComponent()
    41. ' With New Control
    42. ' .Dock = DockStyle.Fill
    43. ' .BackColor = Color.Black
    44. ' Me.CreateControls()
    45. ' End With
    46. 'End Sub
    47. End Class


    der macht aber nicht was er soll,

    Edit sagt: *langsam vergeht mir vb.NET
    2 Sachen fallen mir auf:
    1. Was sollen die vielen Abhängigkeiten von Private Sub Ettel_2_Load(...)?
    2. TranslateForm(ByRef frm As Form) funktioniert nicht, wenn Du den Parameter frm 1. als Form empfängst und 2. nicht verwendest ->

    VB.NET-Quellcode

    1. Public Sub TranslateForm(ByRef frm As Control)
    2. For Each cntrl As Control In frm.Controls
    3. Me.TranslateForm(cntrl)
    4. Next
    5. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Doch, doch, Rod, das mit dem Klassennamen funktioniert bei Forms schon.
    Ist so eine Sache, die nur mit VB geht und auch ziemlich unsinnig ist.
    Nur - sobald mehrere Instanzen da sind, kommt das System durcheinander, außerdem wollen wir doch gleich richtig programmieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    es ist halt rauskommentiert. erstmal :)

    im moment macht er mit dem code:

    VB.NET-Quellcode

    1. Public Class Ettel_2
    2. Dim TB As TextBox
    3. Private Sub Ettel_2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load, MyBase.VisibleChanged, MyBase.Validated, MyBase.TextChanged, MyBase.SystemColorsChanged, MyBase.StyleChanged, MyBase.SizeChanged, MyBase.Shown, MyBase.Enter, MyBase.EnabledChanged
    4. Me.Size = New Size(150, 150)
    5. Me.MinimumSize = Me.Size
    6. CreateControls()
    7. cTBadd()
    8. 'TranslateForm()
    9. Me.Controls.Add(TB)
    10. Dim TBX As TextBox = Me.Controls("txtTextbox1")
    11. End Sub
    12. Private Sub CreateControls()
    13. ' Textbox erstellen
    14. TB = New TextBox
    15. With TB
    16. .Font = New Font("Arial", 12)
    17. .SetBounds _
    18. (10, 10, _
    19. Me.ClientSize.Width - 20, _
    20. Me.ClientSize.Height - 20)
    21. '.Name = "TextBox1"
    22. '.Text = .Name
    23. .Anchor = _
    24. AnchorStyles.Left Or _
    25. AnchorStyles.Top
    26. End With
    27. Me.Controls.Add(TB)
    28. End Sub
    29. Private Sub cTBadd()
    30. For Each ctrl As Control In frm_Ettel_Test.Controls
    31. CreateControls()
    32. Next
    33. End Sub
    34. 'Public Sub TranslateForm(ByRef frm As Form)
    35. ' For Each cntrl As Control In frm.Controls
    36. ' Me.TranslateForm(cntrl)
    37. ' Next
    38. 'End Sub
    39. 'Public Sub markit()
    40. ' InitializeComponent()
    41. ' With New Control
    42. ' .Dock = DockStyle.Fill
    43. ' .BackColor = Color.Black
    44. ' Me.CreateControls()
    45. ' End With
    46. 'End Sub
    47. End Class


    zwar eine Textbox aber da steht nichts drinne. im besten fall sind da jetzt ca 20 textboxen. da ungefähr soviele steuerelemente in der entsprechenden form liegen
    moin moin alle miteinander,

    Ich habe meine Code etwas angepasst und versucht es hinzubekommen aber so richtig wills nicht. Vielleicht aht jemand ne Idee woran es liegt.

    VB.NET-Quellcode

    1. Public Class Ettel_2
    2. Dim TB As TextBox
    3. Private Sub Ettel_2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load, MyBase.VisibleChanged, MyBase.Validated, MyBase.TextChanged, MyBase.SystemColorsChanged, MyBase.StyleChanged, MyBase.SizeChanged, MyBase.Shown, MyBase.Enter, MyBase.EnabledChanged
    4. Me.Size = New Size(150, 150)
    5. Me.MinimumSize = Me.Size
    6. 'CreateControls()
    7. cTBadd()
    8. DoToAllControls(frm_Ettel_Test)
    9. 'TranslateForm(frm_Ettel_Test)
    10. Me.Controls.Add(TB)
    11. lstelem()
    12. Dim TBX As TextBox = Me.Controls("txtTextbox1")
    13. End Sub
    14. 'Private Sub CreateControls()
    15. ' ' Textbox erstellen
    16. ' TB = New TextBox
    17. ' With TB
    18. ' .Font = New Font("Arial", 12)
    19. ' .SetBounds _
    20. ' (10, 10, _
    21. ' Me.ClientSize.Width - 20, _
    22. ' Me.ClientSize.Height - 20)
    23. ' .Name = "TextBox1"
    24. ' .Text = .Name
    25. ' .Anchor = _
    26. ' AnchorStyles.Left Or _
    27. ' AnchorStyles.Top
    28. ' End With
    29. ' Me.Controls.Add(TB)
    30. 'End Sub
    31. Private Sub cTBadd()
    32. For Each ctrl As Control In frm_Ettel_Test.Controls
    33. 'CreateControls()
    34. FlowLayoutPanel1.Controls.Add(New TextBox() With {.Text = .Name})
    35. Next
    36. End Sub
    37. 'Public Sub TranslateForm(ByRef frm As Form)
    38. ' For Each cntrl As Control In frm.Controls
    39. ' Me.TranslateForm(cntrl)
    40. ' Next
    41. 'End Sub
    42. 'Public Sub markit()
    43. ' InitializeComponent()
    44. ' With New Control
    45. ' .Dock = DockStyle.Fill
    46. ' .BackColor = Color.Black
    47. ' Me.CreateControls()
    48. ' End With
    49. 'End Sub
    50. Private Sub DoToAllControls(ByVal m_Control As Control) 'festlegung der aufzählung der Controlls
    51. For Each ctrl As Control In m_Control.Controls
    52. If ctrl.Controls.Count > 0 Then
    53. DoToAllControls(ctrl)
    54. End If
    55. If ctrl.GetType().Equals(GetType(ToolStrip)) Then 'wenn das Controll ein Toolstrip ist
    56. For Each item As ToolStripItem In DirectCast(ctrl, ToolStrip).Items 'wird per Cast das jeweilig 'Item ausgewählt und gelistet
    57. Next
    58. End If
    59. Next
    60. End Sub
    61. Private Sub lstelem()
    62. Dim lstEl As Object
    63. For Each lstEl In Me.Controls
    64. cTBadd()
    65. DoToAllControls(frm_Ettel_Test)
    66. Next
    67. End Sub
    68. End Class


    ich bekomme bisjetzt schonmal die richtige menge an textboxen gelistet aber leider sind alle leer. Diese sollten eigentlich die Namen der SteuerElemente der Mainform auflisten. Tun sie aber nicht und trotz intensiver Befragung des allwissenden Orakels hab ich keine Lösung gefunden.
    Die Textboxen sind deswegen leer, weil Du ihnen keinen Text gibst.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim lfdNb As Integer = 0
    2. Private Sub CreateControls(ByVal txt As String)
    3. ' Textbox erstellen
    4. TB = New TextBox
    5. With TB
    6. .Font = New Font("Arial", 12)
    7. .SetBounds(10, 10, Me.ClientSize.Width - 20, Me.ClientSize.Height - 20)
    8. .Name = "TextBox_" & lfdNb.ToString
    9. .Text = txt'.Name
    10. .Anchor = AnchorStyles.Left Or AnchorStyles.Top
    11. .Location = New Point(10, 20 * lfdNb)
    12. End With
    13. lfdNb += 1
    14. Me.Controls.Add(TB)
    15. End Sub
    16. Private Sub cTBadd()
    17. For Each ctrl As Control In frm_Ettel_Test.Controls
    18. CreateControls(ctrl.Name)
    19. Next
    20. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ein Panel enthält selbst die Controls und wird von außen als ein Control erkannt.
    Du musst erkennen, dass es ein Panel ist und dann dessen Controls auslesen.
    Mach zum Test eine Form, in der neben dem Panel andere Controls liegen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Probier mal dies:

    VB.NET-Quellcode

    1. Private Sub cTBadd()
    2. For Each ctrl As Control In frm_Ettel_Test.Controls
    3. DumpControl(ctrl)
    4. Next
    5. End Sub
    6. Private Sub DumpControl(ByVal ctrlxx As Control)
    7. CreateControls(ctrlxx.Name)
    8. For Each ctrl As Control In ctrlxx.Controls
    9. CreateControls(ctrl.Name)
    10. If (ctrl.Controls.Count <> 0) Then
    11. DumpControl(ctrl)
    12. End If
    13. Next
    14. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Dann solltest Du mal lernen, Fehler zu finden und zu beheben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    joar zusammenhang ist da. aber leider noch immer keine Praktikable Lösung :)

    Ich will es ja hinbekommen das irgendwie diese Controlls aufgelistet werden und ich diese ggf hervorheben kann in der Ursprünglichen Form aber irgendwie schein ich zu doof dafür zu sein eure Lösungsansätze umzusetzen. Liegt vielleicht auch daran das das meine ersten Gehversuche mit vb.NET sind und ich mal absolut keinen Plan hab.

    soweit mir möglich ist und ich es verstehe versuche ich mich in den Code zu lesen um Herauszufinden was dieser gerade macht. Zugegeben ist das nicht so leicht für mich.

    von daher verzeiht bitte meine Unwissenheit
    // Hm, hab wieder versäumt den ganzen Thred zu lesen.. -.-
    Egal, vielleicht bringts trotzdem was..
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Dim loItemNamen As New List(Of String) 'Zeichne die Namen der bisher vorhandenen Controls auf
    4. For Each item As System.Windows.Forms.Control In Me.Controls
    5. loItemNamen.Add(item.Name)
    6. Next
    7. 'Erstelle Textboxen
    8. Dim intAnzahl As Integer = loItemNamen.Count - 1 'Anzahl der Textboxen ist Listengröße der Namen
    9. Dim TB(intAnzahl) As TextBox
    10. Dim Xpos As Integer = 20
    11. Dim Ypos As Integer = 20
    12. For i As Integer = 0 To intAnzahl
    13. TB(i) = New TextBox
    14. Controls.Add(TB(i))
    15. TB(i).Tag = i
    16. TB(i).Name = "TB" & i.ToString
    17. TB(i).Text = loItemNamen.Item(i) 'Trage die Namen der Controls ein
    18. TB(i).Size = New Size(80, 22)
    19. TB(i).Location = New Point(Xpos, Ypos)
    20. Xpos += 90 : If Xpos > 250 Then Xpos = 20 : Ypos += 25
    21. ' AddHandler TB(i).KeyDown, AddressOf TB_KeyDown
    22. Next
    23. End Sub
    24. ' Dim TBnummer As Integer
    25. ' Private Sub TB_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
    26. ' If e.KeyCode = Keys.Return Then 'Wenn Enter gedrückt wurde..
    27. ' e.SuppressKeyPress = True 'Signalton unterdrücken
    28. ' MessageBox.Show(CStr(DirectCast(sender, TextBox).Tag)) 'Messagebox mit Nummer der Textbox ausgeben
    29. ' End If
    30. ' End Sub
    31. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Unwesen“ ()