none
Items verschluckt: Controls.AddRange(Rows.ToArray()) RRS feed

  • Frage

  • Hallo

    Ich habe grade ein Projekt bei dem Datensatze aus einer XML Datei untereinander angezeigt werden sollen. Zuerst werden die Daten in Panals geladen die in einer List gespeichert werden. Dann sollen die Panels in einer GroupBox ("Table") angezeigt werden.

    ' Deklarieung der List Of
    Dim Rows As List(Of Control) = New List(Of Control)
    
    ' Hinzufügen der Panels; wobei CreateRow das Panel erstellt.
    Dim panel As Control = CreateRow(Node_color, Node_set.Attributes("name").Value, pos)
    Rows.Add(panel)
    
    ' Hinzufügen der Panels zur Groupbox "Table"
    Table.Controls.AddRange(Rows.ToArray())

    Wenn ich zum letzten Schritt komme zeigt er mir im Debugger an das sich alle erstellten Panels in der Liste befinden aber es werden trotzdem nicht alle auch hinzugefügt, am Ende ist immer nur das letzte Panel aus der Liste in der Groupbox.

    Wo ist der Fehler?

    Gruß

    Julius


    Julius Störrle

    Mittwoch, 22. Oktober 2014 06:14

Antworten

  • Hallo Julius,

    der Fehler, den ich mir jetzt vorstellen kann, ist dass CreateRow jedes Mal die gleiche Panel-Instanz zurückliefert. Denn AddRange selbst ist nicht der Schuldige, das tut nichts weiter als Control.Add für jedes enthaltene Steuerelement auszuführen.

    Control.Add hingegen prüft, ob ein Steuerelement bereits in einem anderen Control enthalten ist und entfernt es dort, bevor es das Steuerelement in den Container (hier GroupBox) einfügt. Was bei gleichen Referenzen den Effekt haben kann, das es am Ende nur ein neues Steuerelement gibt.

    Im übrigen könntest Du auf die zusätzliche Liste verzichten, anstatt dessen direkt Control.Add verwenden, dafür vorher SuspendLayout und am Ende ResumeLayout für die GroupBox aufrufen.

    Gruß Elmar

    Mittwoch, 22. Oktober 2014 06:38
    Beantworter

Alle Antworten

  • Hallo Julius,

    der Fehler, den ich mir jetzt vorstellen kann, ist dass CreateRow jedes Mal die gleiche Panel-Instanz zurückliefert. Denn AddRange selbst ist nicht der Schuldige, das tut nichts weiter als Control.Add für jedes enthaltene Steuerelement auszuführen.

    Control.Add hingegen prüft, ob ein Steuerelement bereits in einem anderen Control enthalten ist und entfernt es dort, bevor es das Steuerelement in den Container (hier GroupBox) einfügt. Was bei gleichen Referenzen den Effekt haben kann, das es am Ende nur ein neues Steuerelement gibt.

    Im übrigen könntest Du auf die zusätzliche Liste verzichten, anstatt dessen direkt Control.Add verwenden, dafür vorher SuspendLayout und am Ende ResumeLayout für die GroupBox aufrufen.

    Gruß Elmar

    Mittwoch, 22. Oktober 2014 06:38
    Beantworter
  • Danke Peter

    Ich hatte mir das Panel schon im Designer erstellt gehabt und dann immer nur "kopiert". Hab jetzt das gesamte Panel als UserControl zum Projekt hinzugefügt und kann jetzt jedesmal ne neue Instanz erstellen und siehe da es funktioniert. Und danke für den Tipp mit dem Layout ist natürlich ne schönere Lösung.

    Gruß

    Julius


    Julius Störrle

    Mittwoch, 22. Oktober 2014 07:23