2010-02-02 17 views
5

Ich verwende ein TableLayoutPanel, um einen Clientbereich in 3 Zeilen aufzuteilen (es gibt nur 1 Spalte). Die oberen und unteren Reihen sind so konstruiert, dass sie eine feste Höhe haben; Sie werden eine Kopfzeile und eine Fußzeile enthalten, die anfänglich jeweils ein Kind-Label-Steuerelement enthalten, das statischen Text enthält (nur um damit anzufangen). Die mittlere Zeile sollte dynamisch so groß sein, dass sie den verbleibenden Bereich ausfüllt. Dieser mittlere Bereich enthält eventuell eine Listenansicht. Ich habe einen Manager-Klasse, das Objekt als Argument nimmt die Platte (ExplorerTableLayoutPanel) verwaltet werden:TableLayoutPanel: Inhaltszeilen können nicht korrekt skaliert werden

public class ExplorerTableLayoutPanelManager 
{  
    public ExplorerTableLayoutPanelManager(ExplorerTableLayoutPanel panel) 
    { 
     LayoutPanel = panel; 
    } 

Es gibt drei Methoden, die jede der drei Zeilen in der Tabelle Layout erstellen:

private void AddHeaderRow() 
    { 
     const int headerHeight = 30; 
     LayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, headerHeight)); 

     Label label = new Label(); 
     label.BackColor = Color.AliceBlue; 
     label.BorderStyle = BorderStyle.None; 
     label.ForeColor = Color.LightGray; 
     label.TextAlign = ContentAlignment.MiddleRight; 
     label.Text = "Header Banner"; 
     label.Dock = DockStyle.Fill; 
     float size = label.Font.SizeInPoints; 
     label.Font = new Font(label.Font.Name, size * 2); 

     const int column = 0, row = 0; 
     LayoutPanel.Controls.Add(label, column, row); 
    } 


    private void AddBodyRow() 
    { 
     LayoutPanel.RowStyles.Add(new RowStyle(SizeType.AutoSize)); 

     Label label = new Label(); 
     label.BorderStyle = BorderStyle.FixedSingle; 
     label.ForeColor = Color.LightGray; 
     label.TextAlign = ContentAlignment.MiddleCenter; 
     label.Text = "Content Under construction ..."; 
     label.Dock = DockStyle.Fill; 

     float size = label.Font.SizeInPoints; 
     label.Font = new Font(label.Font.Name, size * 2); 

     const int column = 0, row = 1; 
     LayoutPanel.Controls.Add(label, column, row); 
    } 


    private void AddFooterRoow() 
    { 
     const int footerHeight = 30; 
     LayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, footerHeight)); 

     Label label = new Label(); 
     label.BackColor = Color.AliceBlue; 
     label.BorderStyle = BorderStyle.None; 
     label.ForeColor = Color.LightGray; 
     label.TextAlign = ContentAlignment.MiddleRight; 
     label.Text = "Footer Banner"; 
     label.Dock = DockStyle.Fill; 

     float size = label.Font.SizeInPoints; 
     label.Font = new Font(label.Font.Name, size * 2); 

     const int column = 0, row = 2; 
     LayoutPanel.Controls.Add(label, column, row); 
    } 

Die Problem, das ich sehe, ist, dass die letzte Reihe die feste Reihenhöhe einnimmt, die ich als 30 angefordert habe. Dieser Teil ist richtig. Die ersten und zweiten Zeilen teilen jedoch den verbleibenden Raum gleichmäßig zwischen ihnen, was nicht das ist, was ich möchte. Wie Sie sehen, habe ich die Zeilenhöhe für die erste Zeile genau auf die gleiche Weise wie für die letzte Zeile auf 30 gesetzt, aber das scheint nicht zu funktionieren. In der 2. Zeile (Mitte) ist die RowStyle-Größe auf SizeType.AutoSize eingestellt, was ich eigentlich mit dem verbleibenden Platz ausnutzen wollte, also setze die Größe nicht explizit. Ich könnte falsch liegen, aber ich bin mir nicht sicher.

+0

Es Nähte Sie simulieren "Dock" Layout-Eigenschaft mit einer Tabelle, die vorhandenen Styles zuerst aufgenommen von dem Designer-Tool zu löschen. –

Antwort

11

ich Ihren Code nicht getestet, sondern auf einen Blick:

private void AddBodyRow()  
{ 
    LayoutPanel.RowStyles.Add(new RowStyle(SizeType.AutoSize)); 
    ... 

Da Sie den verbleibenden Platz füllen wollen nicht wollen SizeType.AutoSize sonst der Körper Zeile wird versuchen, das Etikett zu schrumpfen passen , obwohl das Label auf DockStyle.Fill gesetzt ist. Was Sie wollen, ist die Zeile füllen den ganzen Raum, um es durch die Verwendung SizeType.Percent können:

private void AddBodyRow()  
{ 
    LayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 100f)); 
    ... 
+2

Danke für Ihre Antwort. Ich habe den Fehler meiner Wege in Bezug auf dieses spezielle Problem gelernt und stelle nun fest, dass 100% bedeutet, dass der gesamte verbleibende Platz gefüllt wird, nachdem die Zeilen mit absolutem Stil zugewiesen wurden. Danke noch einmal. – Zephilim

6

Ich war eine lange Zeit mit der richtigen Größe neu bestimmen Verhalten dieses Objekts zu kämpfen, bis ich herausgefunden habe, dass ich

.RowStyles.Clear(); 

Dann werden die neuen Arten arbeiten:

.RowStyles.Add(new RowStyle(SizeType.AutoSize)); 
Verwandte Themen