Labels in FlowlayoutPanel alphabetisch sortieren

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von MichaHo.

    Labels in FlowlayoutPanel alphabetisch sortieren

    Hi,
    ich füge dynamisch mit unten stehenden Code, Labels in ein FlowLayoutPanel ein.
    Soweit klappt dies auch bestens, allerdings möchte ich gerne, das die Labels nach Ihrem Text sortiert werden.

    Hier erstmal der Code:

    VB.NET-Quellcode

    1. ​Private Sub AddLbLControl(flp As FlowLayoutPanel, tx As String, backCol As Color, id As Integer)
    2. flp.SuspendLayout()
    3. Dim txt = If(tx, "Untitled")
    4. Dim lb = New Label With {.Text = txt, .Tag = id, .BackColor = backCol,
    5. .ForeColor = Color.Black, .Size = New Size(200, 70),
    6. .BorderStyle = BorderStyle.FixedSingle,
    7. .Font = New Font("Segeo UI", 12)}
    8. AddHandler lb.Click, AddressOf OnClickLB
    9. flp.Controls.Add(lb)
    10. flp.ResumeLayout()
    11. End Sub


    In diesem Thread steht, das man den SetChildIndex setzen kann.
    Hab ich getan, allerdings fügt er mir dann die Labels immer vorne an, klar, weil ich ja ne 0 als Index angebe.

    VB.NET-Quellcode

    1. ​flp.Controls.SetChildIndex(lb, 0)


    auch hab ich versucht, vor dem Hinzufügen das FlowLayout dazu zu bewegen eine OrderBy zu setzen.

    VB.NET-Quellcode

    1. ​flp.Controls.OfType(Of Label).OrderBy(Function(l) l.Text)


    Leider scheitert es alles.
    Ich weis auch garnet recht, nach was er die sortiert. Nach Hinzufügen nicht, denn mal ist ein hinzugefügtes ganz hinten, oder mittendrin oder vorne dran.
    Hat jemand ne Idee wie man dies bewerkstelligt?
    "Hier könnte Ihre Werbung stehen..."
    Nur so ne Idee: Alle Controls in einer Array/Collection zwischenspeichern und dort sortieren. Alle Controls aus der ControlCollection des Containers entfernen und die sortierten ControlCollection dort hinzufügen

    VB.NET-Quellcode

    1. Dim container = Me.FlowLayoutPanel1
    2. Dim ctrls = (From c In container.Controls.OfType(Of Label) Order By c.Text).ToArray
    3. container.Controls.Clear()
    4. container.Controls.AddRange(ctrls)

    xtts02 schrieb:

    Nur so ne Idee

    Die war aber gut :)
    Klappt bestens:

    VB.NET-Quellcode

    1. ​Private Sub ReArrangeControl(ctrl As Control)
    2. Dim ctrCol = (From c In ctrl.Controls.OfType(Of Label) Order By c.Text).ToArray
    3. ctrl.Controls.Clear()
    4. ctrl.Controls.AddRange(ctrCol)
    5. End Sub

    was ich in meinen Versuchen vergessen habe ist, die Labels als ​AddRange hinzuzufügen bzw. ein Control array...

    Danke Dir
    "Hier könnte Ihre Werbung stehen..."