Labels mit schleife erstellen

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Labels mit schleife erstellen

    Hi,

    ich wollte mit einer schleife ganz einfach mehrere Labels erzeugen, doch irgendwie bin ich zu blöde

    VB.NET-Quellcode

    1. Dim ls(10) As Label
    2. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    3. For i = 0 To 9
    4. ls(i) = New Label
    5. ls(i).Name = "Label" & i
    6. ls(i).Location = New Point((i * 30), 60)
    7. ls(i).Text = "test" & i
    8. Me.Controls.Add(ls(i))
    9. Next
    10. End Sub
    es wird nur das erste also Label0 angezeigt.
    Füge dies hinzu: :D

    VB.NET-Quellcode

    1. ls(i).Size = New System.Drawing.Size(30, 10)
    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!

    Bluespide schrieb:

    ich wollte mit einer schleife ganz einfach mehrere Labels erzeugen, ...

    Das ist üblicherweise keine gute idee.

    Controls kann man viel sicherer, einfacher und differenzierter konfiguriert mit dem FormDesigner erstellen und plazieren.

    Warum ich aber poste: Wenn dus nicht lassen kannst, codeseitig Controls zu basteln - dann bastel sie erst im FormDesigner, und guck dann in den generierten Designer-Code, wies geht.

    ErfinderDesRades schrieb:


    Das ist üblicherweise keine gute idee.
    Controls kann man viel sicherer, einfacher und differenzierter konfiguriert mit dem FormDesigner erstellen und plazieren.


    Üblicherweise? Also ich kann mir recht gut einige Fälle vorstellen, in denen ein zur Laufzeit erstelltes Layout nützlich ist. Und es hindert einen auch nichts daran, Location, Size und was sonst so gebraucht wird, aus (vordefinierten) Arrays zuzuweisen, wenn die Controls verschiedene Positionen haben sollen.

    Der Vorteil (den ich nun dabei habe): ich kann dabei wesentlich einfacher ein einziges Click Event (oder was auch immer) für alles Label benutzen, in dem ich dann per Direct Cast und der Tag Eigenschaft des Contols ermittle, welches geklickt wurde. Dann nur noch eine Select Case abfrage, um die Aktion des jeweiligen Labels auszuführen.

    Im Desiger erstellte Controls sind in der Hinsicht (soweit ich das beurteilen kann) schon etwas im Nachteil.

    Zur not kann ich dir auch einen Beispiel Code zukommen lassen, wo du dann selbst beurteilen kannst, ob die Umsetzung im FormDesigner dafür nicht erheblich mehr aufwand bedeuten würde.

    Ansonsten stimme ich dir zu, einfach im Designer Code nachsehen, welche Daten VB benötigt, um ein Control darzustellen.

    Unwesen schrieb:

    Üblicherweise? Also ich kann mir recht gut einige Fälle vorstellen, in denen ein zur Laufzeit erstelltes Layout nützlich ist.
    Deswegen sagich "Üblicherweise", weils gibt ja die Ausnahmen.
    Viele der Ausnahmen sind aber nur vermeintlich notwendig, und es gibt noch bessere Designer-Lösungen.
    Also in allem wassich bisher gebastelt habe, gibts kein einziges dynamisch erstelltes Control.
    Ach doch! Ich hab mal eine Spielerei gemacht, wo eine App nur im Systray startet - da hatte ich gar kein Form, nur ein ContextMenustrip alleine ;)

    ich kann dabei wesentlich einfacher ein einziges Click Event (oder was auch immer) für alles Label benutzen, in dem ich dann per Direct Cast und der Tag Eigenschaft des Contols ermittle, welches geklickt wurde. Dann nur noch eine Select Case abfrage, um die Aktion des jeweiligen Labels auszuführen.
    Mit Menus mach ichs immer so - nur die Tag-Property brauchichnich zu belegen.
    Ich erstell ein Menü mit lauter MenuStripItems im Designer, und dann sowas:

    VB.NET-Quellcode

    1. Private Sub MenuStrip_MenuClicked(ByVal Sender As Object, ByVal e As EventArgs) _
    2. Handles ReLoadToolStripMenuItem.Click, SaveToolStripMenuItem.Click, _
    3. ZählhilfeToolStripMenuItem.Click, HilfeToolStripMenuItem.Click, _
    4. TestToolStripMenuItem.Click, AutoVorgangToolStripMenuItem.Click
    5. Select Case True
    6. Case Sender Is ReLoadToolStripMenuItem
    7. DataPersistance.LoadData()
    8. Case Sender Is SaveToolStripMenuItem
    9. Program.DataSetSaver.SaveForm(Me)
    10. Case Sender Is ZählhilfeToolStripMenuItem
    11. Dim f = frmStueck
    12. If f.Visible Then f.BringToFront() Else f.Show(Me)
    13. Case Sender Is AutoVorgangToolStripMenuItem
    14. frmAutoVorgang.AutoVorgangDataGridView.DataSource = Program.Dts.AutoVorgang
    15. frmAutoVorgang.Show(Me)
    16. Case Sender Is HilfeToolStripMenuItem
    17. Process.Start("..\..\Other\Hilfe.rtf")
    18. Case Sender Is TestToolStripMenuItem
    19. End Select
    20. End Sub


    Das mittm Beispiel kannste gern mal machen - wie gesagt: kann schon sein, dassichdir für dein Beispiel zustimmen muß