Schleife um auf Textbox zuzugreifen

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von ThePlexian.

    Schleife um auf Textbox zuzugreifen

    Hallo,

    ich hatte bereits ein ähnliches Problem [VB 2010] Schleife für Textbox(x).Eigenschaft gepostet, bei dem ich auch durch die Hilfe dieses Forums eine Lösung zusammengebracht habe, nur leider ist das hier nicht anwendbar :(

    Ich habe mehrere Textboxen (TextBox1,TextBox2 usw.) und ich möchte, dass für jeden Text, der in diese Textboxen eingetragen wird, ein Listbox Item erstellt wird.
    'Händisch würde das dann in etwa so aussehen:

    VB.NET-Quellcode

    1. Dim TEXT_1 As String = TextBox1.Text
    2. ListBox1.Items.Add(TEXT_1.ToString)
    3. Dim TEXT_2 As String = TextBox2.Text
    4. ListBox1.Items.Add(TEXT_2.ToString) '....usw. bis TEXT_32


    Da ich der Meinung bin, dass es in diesem Fall sehr viel sinnvoller wäre, das mit einer Schleife zu lösen, wollte ich das jetzt versuchen, jedoch weiß ich leider nicht, wie man das am besten zuweist?
    ich hätte es mir so in der Richtung vorgestellt, nur das funktioniert so nicht...

    VB.NET-Quellcode

    1. For x = 1 To 32
    2. Dim TEXT As String = TextBox(x).Text
    3. ListBox1.Items.Add(TEXT.ToString)
    4. Next x


    Es ist dabei aber wichtig, dass ich diese Textboxen bereits im Designer erstellt habe, weil ich auch an anderen Stellen im code darauf zugreife, eine 'Lösung' bei der ich die Textboxen erst in einer Methode für dieses Problem neu erstelle, hätte ich bereits im Internet gefunden, nur leider funktioniert es nicht, wenn ich dabei auf bereits erstellte Textboxen verweise ?(

    Vielen Dank im Voraus :)
    Lies die Strings aller TextBoxen mit einer For Each-Schleife aus und lese das in eine List(Of String) ein.
    Dann kannste mit der For-Schleife immer ein neues Item hinzufügen.
    Und nicht überall .ToString Anhängen, weil der Text schon ein String ist.

    Das ist der Ansatz zum Auslesen:

    VB.NET-Quellcode

    1. For Each c As Control In Me.Controls
    2. If TypeOf(c) Is TextBox Then
    3. 'In die List speichern
    4. End If



    Oder du machst es wie nafets gesagt hat.

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

    Wann soll denn dieses ListBox-Item erstellt werden? Sobald sich der Text ändert oder löst Du das per Button o. ä. aus?
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    nafets3646 schrieb:


    Genau dieser Code von SpaceyX sollte sich ganz einfach umschreiben lassen, einfach anstatt tB.Visible = visible das hinschreiben: ListBox1.Items.Add(tB.Text)


    Danke für die Hilfe, das hab ich jedoch schon gemacht, jedoch geht diese for-each Schleife die Textboxen nicht der Reihe nach (1 bis 32 ) durch, sondern würfelt sie durcheinander, und es sollte so sein ListboxItem1 - TextBox1, ListboxItem2 - TextBox2, usw)
    wenn ich das aber so mache, dann ist da ListboxItem1 - TextBox1, ListboxItem2 - TextBox31, ListboxItem3 - TextBox30, usw...

    programmer71 schrieb:


    Lies die Strings aller TextBoxen mit einer For Each-Schleife aus und lese das in eine List(Of String) ein.
    Dann kannste mit der For-Schleife immer ein neues Item hinzufügen.
    Und nicht überall .ToString Anhängen, weil der Text schon ein String ist.

    VB.NET-Quellcode

    1. For Each c As Control In Me.Controls
    2. If TypeOf c Is TextBox Then
    3. 'In die List speichern
    4. End If



    Oder du machst es wie nafets gesagt hat.


    Danke für die Hilfe, aber ist ja mehr oder weniger das gleiche, also auch das gleiche Problem :(

    SpaceyX schrieb:


    Wann soll denn dieses ListBox-Item erstellt werden? Sobald sich der Text ändert oder löst Du das per Button o. ä. aus?

    Das Listbox Item wird beim Laden der Oberfläche erstellt, also jedes mal, wenn die GUI neu geladen wird, wird auch das ListboxItem aktualisiert (ich lösche jedes mal zuerst den Inhalt der Listbox, und aktualisiere dann die Werte, so dass das Neue nicht nur am Ende hinzugefügt wird)

    mfG Jenny
    ICh schlag folgendes vor:

    VB.NET-Quellcode

    1. For x = 1 To 32
    2. Dim text As String = Me.Controls("Textbox" & x).Text
    3. ListBox1.Items.Add(text)
    4. Next x
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Dann mach dir erstmal ein Array und befüllst das dann ca. so:

    VB.NET-Quellcode

    1. Dim textarray(31) As String
    2. For Each ... 'So wie bei SpaceyXs Code
    3. textarray(CInt(tB.Name.Substring(7)) - 1) = tB.Text
    4. Next
    5. For Each i As String In textarray
    6. ListBox1.Items.Add(i)
    Für mich hört sich das Ganze mittlerweile nach einen Designfehler an. Bist Du Dir sicher, dass Du nicht mit einem DataGridView besser bedient bist? Wenn Du magst, dann erklär mal ein bisschen was über Dein Vorhaben oder Dein Ziel. Evtl. gibt es da eine elegantere Lösung. Man merkt es immer schnell, wenn man auf dem Holzweg ist. Es passt einfach nicht ineinander und da sollte man dann ausschau nach Alternativen halten.

    Wenn Du es nicht anders lösen kannst, dann sortiere eben die _listTextBoxes.

    VB.NET-Quellcode

    1. Public Class TextBoxComparer : Implements IComparer(Of TextBox)
    2. Public Function Compare(x As TextBox, y As TextBox) As Integer Implements IComparer(Of TextBox).Compare
    3. Return String.Compare(x.Name, y.Name)
    4. End Function
    5. End Class


    Nutzen kannst Du das dann in Etwa so.

    VB.NET-Quellcode

    1. Private Sub GetTextBoxes(ByVal container As Control)
    2. For Each c As Control In container.Controls
    3. If TypeOf (c) Is TextBox Then
    4. _listTextBoxes.Add(DirectCast(c, TextBox))
    5. End If
    6. If c.HasChildren Then
    7. GetTextBoxes(c)
    8. End If
    9. Next
    10. _listTextBoxes.Sort(New TextBoxComparer)
    11. End Sub


    Denk unbedingt nochmal drüber nach, das FW auf eine akutelle Version zu bringen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @jen: Sieh Dir mal dies an:

    VB.NET-Quellcode

    1. Dim tbx() = {Me.TextBox1, Me.TextBox2, Me.TextBox3}
    2. For Each tb In tbx
    3. ListBox1.Items.Add(tb.Text)
    4. Next
    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!
    @RodFromGermany

    Danke!
    so etwas habe ich mir auch schon gedacht, aber hierbei muss ich auch wieder alle (31) Textboxen hier eintragen...

    VB.NET-Quellcode

    1. Dim tbx() = {Me.TextBox1, Me.TextBox2, Me.TextBox3}


    gibts da denn gar keine einfachere/schnellere Methode? ?(

    mfG Jenny

    ThePlexian schrieb:

    ICh schlag folgendes vor:

    VB.NET-Quellcode

    1. For x = 1 To 32
    2. Dim text As String = Me.Controls("Textbox" & x).Text
    3. ListBox1.Items.Add(text)
    4. Next x


    DANKE! :) Funktioniert prima! (hatte Ähnliches schon ausprobiert, und hat nie funktioniert, deshalb hatte ich diesen Ansatz schon fast aufgegeben)

    @nafets3646
    Danke für die Hilfe! (habe jetzt aber bereits die Methode von 'ThePlexian' ausprobiert, und werde mal bei der bleiben [kürzer ;) ] )

    @SpaceyX
    Danke für deine Hilfe! (+die Erklärung für die Sortierung der Liste, kann ich ja vielleicht ein anderes Mal brauchen) :)
    Nein ich bin mir leider nicht sicher (Programmieranfänger... :S ) aber ich habe es jetzt einmal so aufgebaut, weil es mir einfach und logisch erschien.
    Es geht um ein Programm, welches ich in ein WinCC Bild (deshalb Framework 3.0) einbinde, mit meinen Text-/Listbox Arrangement lese bzw. schreibe ich dann Werte aus der /in die SPS, und da ich in der Listbox nichts schreiben kann, mache ich das über die Textbox, welche bei Klick auf die Listbox erscheint, und in die ich dann meinen Wert schreibe, der dann auch in die SPS geschrieben, bzw. an der entsprechenden Stelle ausgelesen, und in der Listbox angezeigt wird. (ich hoffe ich habe mich jetzt halbwegs verständlich ausgedrückt...)

    @programmer71
    Danke für die Mühe, werde jetzt aber bei der Methode von 'ThePlexian' bleiben, da ich bei diesen Varianten

    VB.NET-Quellcode

    1. For Each C In Me.Controls
    2. If TypeOf(C) Is TextBox Then
    3. ListBox1.Items.Add(c.Text)
    4. End If
    5. Next
    immer das Problem hatte, dass es hier den Textbox.Text nicht der Reihe nach in meine Listbox einträgt, was aber wichtig für mein Programm ist.
    mfG Jenny
    @jen
    Da du ja die Methode von ThePlexian zurückgreifst, verkürz ich den einfach mal und mach sie OPTION STRICT ON (ganz wichtig!!!):
    [vb]
    For X As Integer = 1 To 32
    ListBox1.Items.Add(Me.Controls(String.Format("TextBox{0}", X)).Text)
    Next

    jen schrieb:

    VB.NET-Quellcode

    1. Dim text As String = Me.Controls("Textbox" & x).Text
    Du solltest in jedem Falle vorher testen, ob es eine TextBox dieses Namens gibt, sonst knallt es!
    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!
    Freut mich, dass ich helfen konnte ;)

    Aber ich bin selbst noch Beginner bei VB.NET, also seid mir um die Einfachkeit des Codes nicht böse ;)

    EDIT:
    @RodFromGermany:
    Ja, geneerell sollte man das vorher testen, aber wenn man weiß, dass genau 32 da sind, ist das wohl uüberflüssig :)
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    ThePlexian schrieb:

    dass genau 32 da sind, ist das wohl überflüssig
    Aber nur Wohl.
    Wenn Du ordentlich programmieren willst, gewöhne Dir einen ordentlichen Stil an und teste, um Exceptions zu vermeiden. Iwann kopierst Du den Code und da ist diese Stelle leicht anders und es knallt.
    Also teste immer. :thumbsup:
    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!