Mehrere Button dynamisch erstellen?

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von VanDerLars.

    Mehrere Button dynamisch erstellen?

    Hallo Community,

    ich habe in einer tstdatei in den einzelnen Zeilen Texte abgespeichert. Anhand dieser Texte soll mein Programm nun Button erstellen. Jede Zeile der Textdatei bekommt dabei einen eigenen Button. Ich kann aber nicht voraus sagen wieviele Button das werden, da auch die Textdatei vom Programm generiert wird.

    Soweit so gut.

    Ich schaffe es aber nicht mehrere Button dynamisch zu erstellen. Die Methode, die ich kenne erstellt immer nur einen Button, und verändert diesen bei jedem While-Durchlauf.

    Könnt Ihr mir helfen?

    hierm mein Code:

    VB.NET-Quellcode

    1. Public Sub profil_laden_Orga_anzeigen()Dim strFilename As String = (Form1.Pfad.Text & "\1Benutzerdaten" & "\1" & Form1.ID2.Text & "\Profil\Orga.txt") 'das ist der Zielpfad zur Textdatei
    2. Dim strValue As String = "" 'Der gelesene Text
    3. Dim reader As StreamReader
    4. Dim button As New Button 'mein button
    5.  
    6.  
    7. If System.IO.File.Exists(strFilename) = True Then
    8. reader = New StreamReader(strFilename)While (reader.Peek > -1)
    9. strValue = reader.ReadLine
    10. Profil_anzeigen.pa_01.Controls.Add(button) 'hier wird der Button erzeugt (pa_01 ist flowlayoutlabel!)
    11. With button 'hier werden ihm die Eigenschaften gegeben
    12. .FlatAppearance.BorderSize = 0
    13. .FlatStyle = FlatStyle.Flat
    14. .ForeColor = Color.FromArgb(69, 69, 69)
    15. .TextAlign = ContentAlignment.MiddleCenter
    16. .AutoSize = True.AutoSizeMode = AutoSizeMode
    17. .GrowAndShrink.BackColor = Color.FromArgb(158, 192, 233)
    18. .Text = strValue
    19. .Name = "Orga" & reader.Peek
    20. .Margin = New Padding(8, 8, 3, 3)
    21. End With
    22.  
    23. End While
    24. reader.Close()
    25. End If
    26. End Sub 'am Ende habe ich aber nur einen Button!
    Ich seh das aber auch so, dass er alle Buttons übereinander legt.

    Versuch mal die Position zu verändern bei jedem Durchlauf. Einfach ne Variable nehmen die du immer um 100 hochzählst.

    Alternativ erst die Werte zuweisen und dann erstellen. Also das add ans ende der Schleife setzen. Könnte das problem der leeren Buttons lösen wie fichz geschrieben hat.
    Also quasi

    VB.NET-Quellcode

    1. Profil_anzeigen.pa_01.Controls.Add(button)
    zwischen Zeile 20 und 21 klemmen.

    Sonst fällt mir nur noch ein

    VB.NET-Quellcode

    1. Dum button as new button
    mit in die Schleife zu nehmen...


    EDIT
    Ich hab das grad mal in mein Programm versucht, wo ich ein haufen textboxen labels und checkboxen dynamisch erstelle.
    Da steht

    VB.NET-Quellcode

    1. Dim TB As New TextBox 'Erzeuge neue Textbox
    2. Dim TB2 As New TextBox
    3. Dim Lab As New Label
    4. Dim Lab2 As New Label
    5. Dim Checkb As New CheckBox
    In der Schleife und es klappt. Nehm ich es aber raus und deklariere außerhalb.
    Dann passiert genau, dass es kommt nur ein Box ein Label und eine checkbox raus.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „runny“ ()

    runny schrieb:

    Alternativ erst die Werte zuweisen und dann erstellen. Also das add ans ende der Schleife setzen. Könnte das problem der leeren Buttons lösen wie fichz geschrieben hat.

    guter ansatz ;)

    und hier die lösung:

    VB.NET-Quellcode

    1. Public Sub profil_laden_Orga_anzeigen()
    2. Dim strFilename As String = (Form1.Pfad.Text & "\1Benutzerdaten" & "\1" & Form1.ID2.Text & "\Profil\Orga.txt") 'das ist der Zielpfad zur Textdatei
    3. Dim strValue As String = "" 'Der gelesene Text
    4. Dim reader As StreamReader
    5. Dim button As New Button 'mein button
    6. If System.IO.File.Exists(strFilename) = True Then
    7. reader = New StreamReader(strFilename)
    8. While (reader.Peek > -1)
    9. strValue = reader.ReadLine
    10. With button 'hier werden ihm die Eigenschaften gegeben
    11. .FlatAppearance.BorderSize = 0
    12. .FlatStyle = FlatStyle.Flat
    13. .ForeColor = Color.FromArgb(69, 69, 69)
    14. .TextAlign = ContentAlignment.MiddleCenter
    15. .AutoSize = True
    16. .AutoSizeMode = AutoSizeMode.GrowAndShrink
    17. .BackColor = Color.FromArgb(158, 192, 233)
    18. .Text = strValue
    19. .Name = "Orga" & reader.Peek
    20. .Margin = New Padding(8, 8, 3, 3)
    21. End With
    22. Me.FlowLayoutPanel1.Controls.Add(button) 'hier wird der Button erzeugt (pa_01 ist flowlayoutlabel!)
    23. button = New Button
    24. End While
    25. reader.Close()
    26. End If


    lg

    EDIT: ist egal geht auch so
    Wichtig ist nur das

    VB.NET-Quellcode

    1. button = New Button

    lg
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Sub profil_laden_Orga_anzeigen()
    2. Dim strFilename As String = (Form1.Pfad.Text & "\1Benutzerdaten" & "\1" & Form1.ID2.Text & "\Profil\Orga.txt") 'das ist der Zielpfad zur Textdatei
    3. Dim strValue As String = "" 'Der gelesene Text
    4. Dim reader As StreamReader
    5. Dim button As New Button 'mein button
    6. If System.IO.File.Exists(strFilename) = True Then
    7. reader = New StreamReader(strFilename)
    8. While (reader.Peek > -1)
    9. strValue = reader.ReadLine
    10. Me.FlowLayoutPanel1.Controls.Add(button) 'hier wird der Button erzeugt (pa_01 ist flowlayoutlabel!)
    11. With button 'hier werden ihm die Eigenschaften gegeben
    12. .FlatAppearance.BorderSize = 0
    13. .FlatStyle = FlatStyle.Flat
    14. .ForeColor = Color.FromArgb(69, 69, 69)
    15. .TextAlign = ContentAlignment.MiddleCenter
    16. .AutoSize = True
    17. .AutoSizeMode = AutoSizeMode.GrowAndShrink
    18. .BackColor = Color.FromArgb(158, 192, 233)
    19. .Text = strValue
    20. .Name = "Orga" & reader.Peek
    21. .Margin = New Padding(8, 8, 3, 3)
    22. End With
    23. button = New Button
    24. End While
    25. reader.Close()
    26. End If

    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

    VanDerLars schrieb:

    Keine Ahnung wieso aber sehr gut!

    button=new button gehört eigendlich an den Anfang der Schleife, aber geht so auch. Der Sinn is folgender: Ganz am Anfang erzeugst du ein Objekt namens button vom Typ (Klasse) Button. Damit wird nicht nur Speicher reserviert, sondern ein fertiges Objekt erzeugt. Dieses hast du in deiner 1. Variante dem Panel hinzugefügt und die Eigenschaften hinzugefügt.
    Im nächsten Schleifendurchlauf passiert folgendes: die Variable button ist ja lediglich die Referenz auf die Stelle im Arbeitsspeicher, wo dein Button liegt. Wenn du jetzt einfach nur hinzufügst zum Panel passiert einfach nix, weil der Button is ja schon da drauf (Parent-Eigenschaft unverändert).
    In der 2. Variante wird der Variablen button innerhalb der Schleife einer Referenz auf ein NEUES Objekt Button gegeben. Der Alte existiert weiterhin. Und nun fügst du dem Panel den neuen Button hinzu. Das ist der trick mit New Button und der Kern der Objektorientierten Programmierung.

    Fiel Fergnügen
    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup: