Ich habe eine Weile damit gekämpft und festgestellt, dass einige andere Leute auch mit dem TableLayoutPanel (.net 2.0 Winforms) zu kämpfen haben.
Problem
Ich versuche, ein 'leeres' Tablelayoutpanel mit 10 definierten Spalten zu erstellen und dann zur Laufzeit programmgesteuert Steuerelementzeilen hinzuzufügen (dh ein Steuerelement pro Zelle).
Man hätte denken können, dass es so einfach sein sollte wie
myTableLayoutPanel.Controls.Add(myControl, 0 /* Column Index */, 0 /* Row index */);
Aber das (für mich) fügt die Zeilen nicht hinzu. Also vielleicht in einer Reihe hinzufügen
myTableLayoutPanel.RowStyles.Clear();
myTableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, 30F));
Das funktioniert aber auch nicht. Ich habe mich umgesehen und herausgefunden, dass sich die myTableLayoutPanel.RowCount
Verwendung von Entwurfszeit zu Laufzeit ändert, daher myTableLayoutPanel.RowCount++;
wird keine weitere Zeile hinzugefügt, auch nicht vor / nach dem Hinzufügen eines RowStyle-Eintrags dafür!
Ein weiteres verwandtes Problem, auf das ich stoße, ist, dass die Steuerelemente zur Anzeige hinzugefügt werden, aber alle einfach am Punkt 0,0 des TableLayoutPanel gerendert werden. Außerdem müssen sie nicht einmal innerhalb der Zellengrenzen liegen, die sie sein sollen angezeigt innerhalb (dh mit Dock = DockStyle.Fill erscheinen sie immer noch viel zu groß / klein).
Hat jemand ein funktionierendes Beispiel für das Hinzufügen von Zeilen und Steuerelementen zur Laufzeit?
Antworten:
Ich habe das erst letzte Woche gemacht. Stellen Sie die
GrowStyle
auf dieTableLayoutPanel
zuAddRows
oderAddColumns
, geben Sie Ihren Code funktionieren sollte:Hier ist ein Arbeitscode, der dem ähnlich zu sein scheint, was Sie tun:
Das
TableLayoutPanel
passt mir immer zur Größe. In meinem obigen Beispiel reiche ich eine Adresskarte ein, die je nach Konto mit der Adresszeile zwei oder einem Land wachsen oder schrumpfen kann. Da sich die letzte Zeile oder Spalte des Tabellenlayoutfensters ausdehnt, werfe ich das leere Etikett hinein, um eine neue leere Zeile zu erzwingen, und dann wird alles gut ausgerichtet.Hier ist der Designer-Code, damit Sie die Tabelle sehen können, mit der ich beginne:
quelle
Es ist ein seltsames Design, aber die
TableLayoutPanel.RowCount
Eigenschaft spiegelt nicht die Anzahl derRowStyles
Sammlung wider , und dies gilt auch für dieColumnCount
Eigenschaft und dieColumnStyles
Sammlung.Was ich in meinem Code gefunden habe, war,
RowCount
/ manuell zu aktualisieren,ColumnCount
nachdem ich Änderungen anRowStyles
/ vorgenommen habeColumnStyles
.Hier ist ein Beispiel für Code, den ich verwendet habe:
Andere Gedanken
Ich habe noch nie
DockStyle.Fill
ein Steuerelement dazu gebracht, eine Zelle im Raster zu füllen . Ich habe dies getan, indem ich dieAnchors
Eigenschaft des Steuerelements festgelegt habe.Wenn Sie viele Steuerelemente hinzufügen, stellen Sie sicher, dass Sie den Prozess aufrufen
SuspendLayout
undResumeLayout
um ihn herum ausführen. Andernfalls werden die Dinge langsam ausgeführt, da das gesamte Formular nach dem Hinzufügen jedes Steuerelements erneut angezeigt wird.quelle
Hier ist mein Code zum Hinzufügen einer neuen Zeile zu einer zweispaltigen TableLayoutColumn:
Das Beschriftungssteuerelement befindet sich in der linken Spalte und das Wertesteuerelement in der rechten Spalte. Die Steuerelemente sind im Allgemeinen vom Typ Label und haben die AutoSize-Eigenschaft auf true gesetzt.
Ich denke nicht, dass es zu wichtig ist, aber als Referenz ist hier der Designer-Code, der detailTable erstellt:
Das alles funktioniert gut. Sie sollten sich bewusst sein, dass es Probleme beim dynamischen Entsorgen von Steuerelementen aus einem TableLayoutPanel mithilfe der Controls-Eigenschaft zu geben scheint (zumindest in einigen Versionen des Frameworks). Wenn Sie Steuerelemente entfernen müssen, empfehle ich, das gesamte TableLayoutPanel zu entsorgen und ein neues zu erstellen.
quelle
Erstellen Sie ein Tabellenlayoutfenster mit zwei Spalten in Ihrem Formular und benennen Sie es
tlpFields
.Fügen Sie dann einfach ein neues Steuerelement zum Tabellenlayout hinzu (in diesem Fall habe ich 5 Beschriftungen in Spalte 1 und 5 Textfelder in Spalte 2 hinzugefügt).
Führen Sie abschließend den Code aus.
quelle
Ich habe gerade in meinen Code geschaut. In einer Anwendung füge ich nur die Steuerelemente hinzu, ohne jedoch den Index anzugeben. Wenn ich fertig bin, durchlaufe ich einfach die Zeilenstile und setze den Größentyp auf AutoSize. Wenn Sie sie also nur hinzufügen, ohne die Indizes anzugeben, werden die Zeilen wie beabsichtigt hinzugefügt (vorausgesetzt, der GrowStyle ist auf AddRows eingestellt).
In einer anderen Anwendung lösche ich die Steuerelemente und setze die RowCount-Eigenschaft auf den erforderlichen Wert. Dies fügt die RowStyles nicht hinzu. Dann füge ich meine Steuerelemente hinzu, diesmal unter Angabe der Indizes, und füge einen neuen RowStyle hinzu (
RowStyles.Add(new RowStyle(...)
) hinzu. Dies funktioniert auch.Wählen Sie also eine dieser Methoden, beide funktionieren. Ich erinnere mich an die Kopfschmerzen, die mir das Tabellenlayout verursacht hat.
quelle
quelle
Dies funktioniert perfekt zum Hinzufügen von Zeilen und Steuerelementen in einem TableLayoutPanel.
Definieren Sie ein leeres Tablelayoutpanel mit 3 Spalten auf der Entwurfsseite
Erstellen Sie eine Schaltfläche btnAddRow, um bei jedem Klick Zeilen hinzuzufügen
quelle
Ich hatte gerade ein verwandtes Problem (so fand ich diesen Thread), bei dem meine dynamisch hinzugefügten Zeilen- und Spaltenstile nicht wirksam wurden. Normalerweise betrachte ich SuspendLayout () / ResumeLayout () als Optimierungen, aber in diesem Fall haben sich die Zeilen und Spalten korrekt verhalten, wenn ich meinen Code in sie eingeschlossen habe.
quelle