2011-09-01 22 views
10

Tôi có thể không sử dụng quyền kiểm soát những gì tôi muốn. Tôi đang điền một bảng với các điều khiển và tôi muốn mỗi cột tự động kích thước để các điều khiển chứa bên trong nó. Ví dụ: một cột các hộp văn bản sẽ rộng hơn một cột các hộp kiểm. Tôi không muốn fiddle với đo nếu tôi có thể giúp nó, do sự phức tạp của hệ điều hành khác nhau, DPI khác nhau, phông chữ khác nhau, vv Bảng có thể mở rộng theo chiều ngang để phù hợp với điều khiển, với một thanh cuộn. Làm thế nào điều này có thể với một TableLayoutPanel - hoặc một số điều khiển khác?TableLayoutPanel sizing

Cảm ơn.

Edited thêm mã:

private void UpdateLocations() 
    { 
     tableLayoutPanel1.RowCount = CurrentSchedule.location.Length + 1; 
     tableLayoutPanel1.ColumnCount = 7; 
     int row = 1; 
     int timeWidth = TextRenderer.MeasureText("00:00:00x", tableLayoutPanel1.Font).Width; 

     Label lab = new Label(); 
     lab.Text = "Location"; 
     tableLayoutPanel1.Controls.Add(lab, 0, 0); 

     lab = new Label(); 
     lab.Text = "Arrive"; 
     tableLayoutPanel1.Controls.Add(lab, 1, 0); 

     lab = new Label(); 
     lab.Text = "Depart"; 
     tableLayoutPanel1.Controls.Add(lab, 2, 0); 

     lab = new Label(); 
     lab.Text = "Pass?"; 
     tableLayoutPanel1.Controls.Add(lab, 3, 0); 

     lab = new Label(); 
     lab.Text = "Path"; 
     tableLayoutPanel1.Controls.Add(lab, 4, 0); 

     lab = new Label(); 
     lab.Text = "Plat"; 
     tableLayoutPanel1.Controls.Add(lab, 5, 0); 

     lab = new Label(); 
     lab.Text = "Line"; 
     tableLayoutPanel1.Controls.Add(lab, 6, 0); 

     foreach (location loc in CurrentSchedule.location) 
     { 
      TextBox tb = new TextBox(); 
      tb.Text = loc.locationID; 
      tableLayoutPanel1.Controls.Add(tb, 0, row); 

      tb = new TextBox(); 
      tb.Text = loc.arrivalTime; 
      tb.Width = timeWidth; 
      tableLayoutPanel1.Controls.Add(tb, 1, row); 

      tb = new TextBox(); 
      tb.Text = loc.departureTime; 
      tb.Width = timeWidth; 
      tableLayoutPanel1.Controls.Add(tb, 2, row); 

      CheckBox cb = new CheckBox(); 
      cb.Checked = loc.passingTime; 
      tableLayoutPanel1.Controls.Add(cb, 3, row); 

      tb = new TextBox(); 
      tb.Text = loc.pathCode; 
      tableLayoutPanel1.Controls.Add(tb, 4, row); 

      tb = new TextBox(); 
      tb.Text = loc.platformCode; 
      tableLayoutPanel1.Controls.Add(tb, 5, row); 

      tb = new TextBox(); 
      tb.Text = loc.lineCode; 
      tableLayoutPanel1.Controls.Add(tb, 6, row); 

      row++; 
     } 
     /*for (int idx = 0; idx < tableLayoutPanel1.RowCount; idx++) 
     { 
      tableLayoutPanel1.RowStyles[idx].SizeType = SizeType.AutoSize; 
     } 
     for (int idx = 0; idx < tableLayoutPanel1.ColumnCount; idx++) 
     { 
      tableLayoutPanel1.ColumnStyles[idx].SizeType = SizeType.AutoSize; 
     }*/ 
    } 

(Có nó cần refactoring nặng - Tôi chỉ cố gắng để làm cho nó làm việc đầu tiên)

Các bit nhận xét ra gây ngoài giới hạn trường hợp ngoại lệ, thậm chí mặc dù hợp lý (với tôi) nó không nên. Phạm vi xuất hiện giới hạn ở bất kỳ thứ gì tôi đặt vào thời gian thiết kế, không phải lúc chạy.

+0

Bạn có bao nhiêu cột? – CharithJ

+0

Nếu một cột cụ thể chỉ có các hộp kiểm tại sao chúng cần phải thay đổi kích thước? – CharithJ

+0

Các cột không cần phải tự động thay đổi kích thước, nhưng được đặt thành kích thước cụ thể khi các điều khiển được thêm vào. Tại thời điểm này tôi đang sử dụng kích thước tự động có nghĩa là tất cả các cột có cùng chiều rộng. – GeoffM

Trả lời

15

Xin lỗi, nhưng có gì sai khi đặt các cột được đặt thành Tự động hóa? Đó là những gì TableLayoutPanel làm, kích thước cột để phù hợp với các điều khiển bên trong nó. Mở rộng bảng và có một thanh cuộn sẽ yêu cầu bạn đặt các bảng Tự động hóa thuộc tính thành true, sau đó đặt TableLayoutPanel trong một bảng điều khiển khác đã bật thanh cuộn. Nhưng việc định kích thước cột nên hoạt động ra khỏi hộp nếu tôi không hiểu rõ yêu cầu của bạn.

Chỉ cần đảm bảo, bạn sẽ chuyển đến thuộc tính cột và đặt Kích thước của mỗi cột thành Tự động chỉnh sửa phải không? Không chỉ thuộc tính AutoSize của bảng?

enter image description here

là những gì bạn muốn?

-Mã hàng:

Cảm ơn mã. Tôi khuyên bạn nên sử dụng nhà thiết kế để thực hiện rất nhiều điều này. Ít nhất để thiết lập các cột, hãy đặt chúng thành tự động và thêm nhãn tiêu đề.

Bạn cũng có thể muốn kiểm tra điều khiển Datagrid và liên kết với danh sách vị trí của mình.

Để có được phương pháp này làm việc mặc dù:

1) lý do cột của bạn trông cùng kích thước là do nhãn tiêu đề bạn đang sử dụng đều không autosizing. Chúng rộng x pixel và kéo dài các cột.Thực hiện việc này:

Label lab = new Label(); 
lab.AutoSize = true; 
lab.Text = "Location"; 
tableLayoutPanel1.Controls.Add(lab, 0, 0); 

Bạn cũng sẽ cần đặt thuộc tính Tự động hóa thành true trên hộp kiểm Kiểm tra và bất kỳ nhãn nào khác bạn thêm làm nội dung.

2) Đặt RowCount và ColumnCount sẽ không ảnh hưởng đến bộ sưu tập RowStyles hoặc ColumnStyles. Bạn có 7 Cột nhưng chỉ có 2 Cột. Hãy thử:

tableLayoutPanel1.ColumnStyles.Clear(); 
for (int i = 0; i < tableLayoutPanel1.ColumnCount; i++) 
{ 
    tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); 
} 

tableLayoutPanel1.RowStyles.Clear(); 
for (int i = 0; i < tableLayoutPanel1.RowCount; i++) 
{ 
    tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.AutoSize)); 
} 

Chỉ một điều khác cần lưu ý là một số điều khiển sẽ được căn lề trong các hàng (nhãn xuất hiện quá cao chẳng hạn). Để khắc phục điều đó, hãy đặt thuộc tính Lề, thường là 3,6,3,0 để căn chỉnh chúng với hộp văn bản và hộp kiểm, v.v.

+0

Vâng, đó là những gì tôi muốn . Nhưng từ những gì tôi đọc về cách tính toán độ rộng ("GetPreferredWidth") nó không nên làm điều đó ... Có lẽ tôi không thiết lập các thuộc tính trong sự kết hợp chính xác. Tuy nhiên, tôi gặp sự cố khi đặt hàng và cột - xem mã đã chỉnh sửa ở trên. – GeoffM

+0

DOH! Chiều rộng nhãn đầu trang, được phát hiện tốt! Và phần còn lại của câu trả lời cũng có ý nghĩa. Cảm ơn. – GeoffM

0

Bạn sẽ cần phải xử lý các sự kiện ControlAdded, sau đó thay đổi kích thước cột nếu chiều rộng sự kiểm soát mới là lớn hơn chiều rộng của cột ...

Bạn nói rằng bạn không muốn fiddle với đo lường, nhưng nếu bạn đang thay đổi kích cỡ, bạn phải làm như vậy. Phông chữ và như vậy không nên đi vào nó nếu bạn cẩn thận về các TextAlign của hộp kiểm của bạn vv ...

+0

Tôi đã hy vọng cho chức năng bảng giống như HTML, nơi các cột (và hàng) có thể tự động kích thước. Tôi cảnh giác với việc phải làm việc trên, nói Vista, và sau đó thấy rằng các biên giới trên Win7 là 2px dày hơn (hoặc chủ đề, hoặc bất cứ điều gì thay đổi các thông số quan trọng). Tôi đoán nếu chỉ đơn giản là sử dụng chiều rộng và chiều cao của điều khiển là đủ đáng tin cậy thì tôi sẽ sử dụng nó. – GeoffM

+0

Độ rộng của điều khiển phải đủ tin cậy. Có nói rằng tôi đã thấy các ứng dụng winform (từ các nhà phát triển khác, vì vậy không chắc chắn làm thế nào nó đã được thực hiện) hiển thị khác nhau trong Windows 7 hơn trong XP, vì vậy tôi không đảm bảo nó sẽ làm việc :-) – andyhasit

0

Bạn có thể sử dụng nhiều splitContainers một trong bảng điều khiển của người khác. Nhưng không sử dụng nhiều bảng lồng nhau, bạn có thể nhận lại kích thước/vẽ lại các vấn đề như this.

Bạn có thể tìm thấy nhiều ví dụ nếu bạn muốn sử dụng SplitContainer.