2010-05-04 38 views
15

Tôi có tablelayoutpanel. 2x2 - 2 cột 2 hàng. Ví dụ: Tôi đã thêm một nút button1 trong một hàng 1, cột thứ hai. button1 có thuộc tính dock được đặt thành Fill. VS Designer cho phép đặt thuộc tính span/column của button1.Thay đổi hàng/cột span theo lập trình (tablelayoutpanel)

Tôi muốn một tính sẵn sàng để thay đổi thuộc tính khoảng hàng button1programatically, vì vậy nó có thể lấp đầy tất cả các cột thứ hai (1 hàng và hàng thứ hai) và tính sẵn sàng để cài đặt nó trở lại.

Làm cách nào?

Trả lời

25

Còn mã này thì sao?

private void button1_Click(object sender, EventArgs e) 
{ 
    var control = sender as Control; 

    if(control == null) 
     return; 

    if (1 == tableLayoutPanel1.GetRowSpan(control)) 
    { 
     tableLayoutPanel1.SetRowSpan(control, 2); 
    } 
    else 
    { 
     tableLayoutPanel1.SetRowSpan(control, 1); 
    } 
} 
+1

mã tuyệt vời. Visual Studio Designer đánh lừa tôi. Tôi đã tìm kiếm trong các thuộc tính button1, đã cố gắng để cast button1 để item toolstippanel và như vậy ... cảm ơn! –

+0

nếu bạn đã xem xét Form.Designer.cs thay vì nhà thiết kế trực quan, bạn đã tìm thấy giải pháp trực tiếp. ;-) – Oliver

+1

Tôi biết đó là một bài đăng cũ, nhưng tôi muốn chỉ ra rằng bạn không cần phải thực hiện "điều kiện yoda" trong C# vì nếu các câu lệnh được nhập mạnh mẽ. (Và tôi tin rằng nếu bạn mắc lỗi với boolean và đặt một bài tập thay vì so sánh, nó sẽ tạo ra một cảnh báo trình biên dịch, trái ngược với lỗi mà nó tạo ra với bất kỳ kiểu nào khác.) – MiffTheFox

2

Trong khi tôi tìm thấy câu trả lời bình chọn hiện tại khá đầy đủ, nó cũng xuất hiện hơi lộn xộn hơn mức cần thiết. Bạn phải thêm các điều khiển vào tableLayoutPanel trước khi thiết lập các thuộc tính của chúng.

Visual Studio (2013 và các phiên bản khác có khả năng) sẽ hiển thị các thuộc tính này như một phần của kiểm soát. Khi trong thực tế, chúng là một phần của tableLayoutPanel.

Giải thích:

tableLayoutPanel.Controls.Add(**control**, x, y) 
tableLayoutPanel.SetColumnSpan(**control**, '# of cols to span') 

Ví dụ:

tableLayoutPanel1.Controls.Add(**button1**, 0, 0); 
tableLayoutPanel1.SetColumnSpan(**button1**, 2); 
tableLayoutPanel1.SetRowSpan(**button1**, 3); 

Kết quả: Một nút mà 'chiếm' không gian này. (Nếu nó đủ lớn để che phủ khu vực này. Ngay cả khi nó không 'che' không gian đó, nó sẽ vẫn 'bảo tồn' nó.)

O O X X X 
O O X X X 
O O X X X 
X X X X X 
X X X X X 

Đặt khoảng cách lớn hơn kích thước của lưới. .: KHÔNG thay đổi kích thước lưới. KHÔNG cắt/chỉnh sửa số thành kích thước của lưới. KHÔNG ném lỗi khi biên dịch.

Nó S act hoạt động/thực hiện như thể khoảng đã được đặt thành kích thước tối đa lưới (tableLayoutPanel) hiện tại. Điều này chỉ có liên quan nếu TLP/kích thước lưới thay đổi.

Nếu bạn thêm hai điều khiển hai cùng một vị trí lưới theo lập trình, điều khiển đầu tiên trong lưới sẽ giữ vị trí của nó. Bất kỳ điều khiển bổ sung sau đó được đẩy vào khối ô tiếp theo. Nếu một 'span' được thêm vào, nó sẽ xử lý khối ô đó như được sử dụng và tiếp tục tìm kiếm một khối ô không sử dụng.

Ex: label1, LABEL2label3 được thêm vào 0,0.

  • label1 sẽ xuất hiện trong 0,0
  • LABEL2: 0,1
  • label3: 0,2

Ex 2: nhãn 1 có một khoảng hàng của 2.

  • label1: 0,0
  • LABEL2: chuyển đến 0,2
  • label3: 0,3

Sau khi bạn đã chọn điểm lưới chính xác và nhịp, bạn có thể sau đó tiếp tục tối ưu hóa bố cục của bạn bằng cách sử dụng thuộc tính neo và neo.

Các vấn đề liên quan