Benutzer mit den meisten Antworten
Items verschluckt: Controls.AddRange(Rows.ToArray())

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
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
- Als Antwort markiert Julius Störrle Mittwoch, 22. Oktober 2014 07:19
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
- Als Antwort markiert Julius Störrle Mittwoch, 22. Oktober 2014 07:19
-
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