2010-02-02 23 views
5

Tôi đang sử dụng TableLayoutPanel để chia vùng khách hàng thành 3 hàng (chỉ có 1 cột). Các hàng trên cùng và dưới cùng được thiết kế có chiều cao cố định; chúng sẽ chứa một đầu trang và một chân trang mà ban đầu mỗi phần chứa một điều khiển nhãn con chứa văn bản tĩnh (chỉ để bắt đầu với). Hàng ở giữa nên được kích thước động để lấp đầy khu vực còn lại. Khung giữa này cuối cùng sẽ chứa một listview. Tôi có một lớp học quản lý mà mất như một cuộc tranh cãi bảng điều khiển (ExplorerTableLayoutPanel) đối tượng được quản lý:TableLayoutPanel: Không thể nhận hàng nội dung có kích thước chính xác

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

Có 3 phương pháp mà tạo ra từng 3 hàng trong cách bố trí bảng:

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); 
    } 

Các vấn đề tôi thấy là hàng cuối cùng đang chiếm chiều cao hàng cố định mà tôi đã yêu cầu là 30. Phần này là chính xác. Tuy nhiên, các hàng đầu tiên và thứ hai được chia tách không gian còn lại bằng nhau giữa chúng mà không phải là những gì tôi muốn. Như bạn có thể thấy, tôi đã thiết lập rõ ràng chiều cao hàng thành 30 cho hàng đầu tiên theo cách chính xác như được thực hiện cho hàng cuối cùng, nhưng điều này dường như không hoạt động. Hàng thứ 2 (giữa) có kích thước RowStyle của nó được đặt thành SizeType.AutoSize mà mặc dù tôi có nghĩa là sử dụng hết dung lượng còn lại, vì vậy đừng đặt kích thước rõ ràng. Tôi có thể sai nhưng tôi không chắc chắn.

+0

Nó vỉa bạn đang mô phỏng "Dock" tài sản bố trí với một bảng. –

Trả lời

11

tôi đã không kiểm tra mã của bạn, nhưng trong nháy mắt:

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

Vì bạn muốn lấp đầy khoảng trống còn lại không muốn SizeType.AutoSize khác hàng thân sẽ cố gắng thu nhỏ để phù hợp với nhãn , mặc dù nhãn được đặt thành DockStyle.Fill. Những gì bạn muốn là làm cho hàng lấp đầy tất cả các không gian nó có thể bằng cách sử dụng SizeType.Percent:

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

Cảm ơn bạn đã trả lời. Tôi đã học được lỗi của cách của tôi liên quan đến vấn đề này cụ thể và bây giờ nhận ra rằng 100% có nghĩa là điền vào tất cả các không gian còn lại sau khi các hàng với phong cách tuyệt đối đã được phân bổ. Cảm ơn một lần nữa. – Zephilim

6

tôi đã đấu tranh một thời gian dài với các hành vi thay đổi kích thước chính xác của đối tượng này cho đến khi tôi phát hiện ra, mà tôi cần để xóa các phong cách hiện đầu tiên, bổ sung bởi các công cụ thiết kế:

.RowStyles.Clear(); 

Sau đó, phong cách mới đang làm việc:

.RowStyles.Add(new RowStyle(SizeType.AutoSize)); 
Các vấn đề liên quan