Panel.Dock Fill bỏ qua các cài đặt Panel.Dock khác


154

Nếu bạn tạo một bảng trên một biểu mẫu và đặt nó vào Dock = Top và thả một bảng khác và đặt Dock = Fill, nó có thể điền vào toàn bộ biểu mẫu, bỏ qua bảng đầu tiên. Thay đổi thứ tự tab không làm gì cả.

Câu trả lời:


335

Bố trí lắp ghép phụ thuộc vào thứ tự điều khiển anh chị em. Các điều khiển được neo "nút lên", vì vậy điều khiển cuối cùng trong bộ sưu tập được neo trước . Một điều khiển được neo chỉ đưa vào bố trí của anh chị em được neo trước đó . Do đó, điều khiển với Dock = Fill phải là đầu tiên (trên cùng) theo thứ tự anh chị em, nếu bạn muốn nó đưa các điều khiển được neo khác vào tài khoản. Nếu nó không phải là điều khiển đầu tiên, các điều khiển trước đó sẽ chồng lấp nó.

Điều này có thể gây nhầm lẫn bởi vì thứ tự anh chị em không nhất thiết phải giống với thứ tự trực quan và thứ tự anh chị em không phải lúc nào cũng rõ ràng từ quan điểm thiết kế.

Các tài liệu phác thảo cửa sổ (View -> Windows khác -> Tài liệu đề cương) đưa ra một cây-view hữu ích trong hệ thống phân cấp quản lý và trật tự, và cho phép bạn thay đổi thứ tự của anh chị em điều khiển.

Bạn cũng có thể thay đổi thứ tự anh chị em trực tiếp trong trình thiết kế theo menu ngữ cảnh -> Đưa ra phía trước / Gửi về phía sau, điều này di chuyển điều khiển thành đầu tiên hoặc cuối cùng của anh chị em. Các nhãn menu này có thể hơi khó hiểu vì hiệu ứng thực tế phụ thuộc vào mô hình bố trí.

Với các điều khiển được định vị cố định, vị trí 2D không phụ thuộc vào thứ tự anh chị em, nhưng khi các điều khiển bị chồng chéo, điều khiển sớm nhất theo thứ tự sẽ là "trên cùng", ẩn một phần của anh chị em sau đó theo thứ tự. Trong bối cảnh này Đưa ra phía trước / Gửi để trở lại có ý nghĩa.

Bên trong bảng điều khiển dòng hoặc bảng bố trí, thứ tự tạo xác định thứ tự trực quan của các điều khiển. Không có điều khiển chồng chéo. Vì vậy, đưa ra phía trước / gửi trở lại thực sự có nghĩa là thực hiện đầu tiên hoặc cuối cùng theo thứ tự kiểm soát.

Với cách bố trí được neo, việc đưa ra phía trước / gửi về phía sau có thể còn khó hiểu hơn vì nó xác định thứ tự được tính theo thứ tự, do đó, "đưa ra phía trước" trên điều khiển được gắn vào sẽ đặt điều khiển ở giữa cha mẹ , đưa tất cả các điều khiển cạnh neo vào tài khoản.


1
Tôi có một bảng điều khiển, dải trạng thái và dải menu trên tất cả trên một biểu mẫu và dường như khi tôi gắn dải menu lên trên cùng, dải trạng thái ở dưới cùng và điền vào bảng điều khiển, bảng điều khiển không lấp đầy khoảng trống ở giữa hai dải trừ khi đó là anh chị em đầu tiên (ở đầu cửa sổ Tài liệu phác thảo phía trên hai dải). Di chuyển bảng điều khiển xuống (về phía "cuối cùng") trên các dải. Vậy điều khiển Dock = Fill có thực sự là anh chị em đầu tiên theo thứ tự không? Tôi đang đọc sai à? Tôi đang sử dụng 3.5 (2008). Điều này có thay đổi không?
jrsconfitto

53
tl; dr; Nhấp chuột phải vào bảng điều khiển với Dock = Fill và nhấp vào 'Đưa ra phía trước'.
kristianp

20
+1 cho cửa sổ Tài liệu phác thảo. Không bao giờ biết điều này tồn tại, nhưng nó rất hữu ích.
gligoran

2
Làm thế nào tôi có thể làm điều này theo chương trình? Ý tôi là, tôi đang thêm các điều khiển một cách linh hoạt để tôi không thể sử dụng trình thiết kế để làm điều này.
Camilo Martin

2
@Camilo: Nếu bạn thêm điều khiển động, bạn nên thêm chúng theo thứ tự bạn muốn.
JacquesB

110

Nhấp chuột phải vào bảng điều khiển với Dock = Fill và nhấp vào 'Đưa ra phía trước'.

Điều này làm cho điều khiển này được tạo sau cùng, có tính đến cài đặt Dock trên các điều khiển khác trong cùng một vùng chứa.


1
Thật đơn giản, trời ơi, điều này thực sự đã làm tôi khó chịu
smirkingman

Làm cho ý nghĩa một khi bạn nghĩ về nó.
Gary Kindel

7

Một tùy chọn khác, có khả năng sạch hơn là sử dụng điều khiển TableLayout. Thiết lập một hàng có chiều cao mong muốn cho thanh công cụ trên cùng của bạn và một hàng khác để lấp đầy 100% cho phần dưới cùng của bạn. Đặt cả hai bảng bên trong thành Fill, và bạn đã hoàn thành.

(Tuy nhiên, TableLayout sẽ làm quen với một số.)


1
TableLayout cũng chậm hơn so với docking conterols cho hiệu năng bố trí, đặc biệt nếu bạn đã sử dụng các điều khiển người dùng lồng nhau sử dụng TableLayout. Tuy nhiên, nó mang lại một bố cục đẹp để chắc chắn.
Nick

1
Hiệu suất này có đạt được thứ mà người dùng trung bình sẽ thấy trong trường hợp đơn giản gồm hai bảng, như được mô tả ở trên không? Hay đó là điều họ nhận thấy khi bạn có hàng tá UC, tất cả đều có bố cục, tất cả trong một bố cục? (Trớ trêu thay, ứng dụng tôi hiện đang làm việc lại như vậy và hiệu suất có vẻ ổn ...)
John Rudy

TableLayout có trọng lượng khá nhẹ. Bạn sẽ không thấy các vấn đề về hiệu suất nếu bạn chỉ đưa ra một vài điều khiển.
Tim

7

Tôi đã có cùng một vấn đề và tôi đã giải quyết nó.
Nếu bạn có một thùng chứa với DockStyle.Fillnhững người khác thì cũng nên có DockStyle nhưng Top hoặc bất cứ thứ gì bạn muốn.
Điều quan trọng là thêm điều khiển với DockStyle.Fillđầu tiên trong Điều khiển sau đó là điều khiển khác.

Thí dụ:

ComboBox cb = new ComboBox();
cb.Dock =  DockStyle.Top;

GridView gv = new GridView();
gv.Dock =  DockStyle.Fill;

Controls.Add(gv); // this is okay
Controls.Add(cb);

nhưng nếu chúng ta đặt cb trước

Controls.Add(cb);
Controls.Add(gv); // gv will overlap the combo box.

2

Nếu bạn không muốn thay đổi thứ tự của các phần tử bên trong mã, bạn có thể sử dụng phương thức Container.Controls.SetChild Index () với Container là ví dụ Biểu mẫu, Bảng điều khiển, v.v. bạn muốn thêm điều khiển của mình vào.

Thí dụ:

     //Container ------------------------------------
     Panel Container = new Panel();

     //Top-Docked Element ---------------------------
     ButtonArea = new FlowLayoutPanel();
     Container.Controls.Add(ButtonArea);
     Container.Controls.SetChildIndex(ButtonArea, 1);
     ButtonArea.Dock = DockStyle.Top;

     //Fill-Docked Element --------------------------
     box = new RichTextBox();
     Container.Controls.Add(box);
     Container.Controls.SetChildIndex(box, 0); //setting this to 0 does the trick
     box.Dock = DockStyle.Fill;

1

JacquesB có ý tưởng với đề cương tài liệu nhưng hệ thống phân cấp không giải quyết được vấn đề của tôi. Các điều khiển của tôi không theo kiểu phân cấp mà chúng chỉ được liệt kê với cùng cha mẹ.

Tôi đã học được rằng nếu bạn thay đổi thứ tự, nó sẽ sửa theo cách bạn muốn.

Các điều khiển ở dưới cùng của danh sách sẽ chồng lấp các điều khiển ở trên cùng của nó trong cửa sổ Tài liệu phác thảo. Trong trường hợp của bạn, bạn sẽ chắc chắn rằng bảng đầu tiên ở dưới bảng thứ hai và vv.


0

Đây là một mẹo làm việc cho tôi ..

Đặt mục trên cùng và gắn nó lên trên.

Đặt một Splitter và cũng gắn nó lên trên cùng, sau đó đặt nó bị vô hiệu hóa (trừ khi bạn muốn thay đổi kích thước trên cùng).

Sau đó, đặt đối tượng Fill và đặt Docking thành Fill. Đối tượng sẽ ở dưới bộ chia.


0

Tôi gặp vấn đề tương tự. Của tôi là với việc thêm các điều khiển mới / tùy chỉnh bên dưới dải menu trong thời gian chạy. Vấn đề là các điều khiển khi cập cảng, quyết định cập bến từ đầu biểu mẫu và hoàn toàn bỏ qua dải menu hoàn toàn, rất khó chịu nếu bạn hỏi tôi. Vì điều này phải được thực hiện linh hoạt với mã và không trong chế độ thiết kế, điều này trở nên cực kỳ bực bội. Cách đơn giản nhất mà tôi tìm thấy là tạo một bảng điều khiển trong chế độ thiết kế và đặt bên dưới dải menu. Từ đó bạn chỉ cần thêm / xóa các điều khiển vào bảng điều khiển và bạn có thể gắn nó trong thời gian chạy. Không cần phải lộn xộn với tất cả các điều khiển của bạn trên biểu mẫu của bạn mà không thực sự cần thay đổi, quá nhiều công việc tùy thuộc vào những gì bạn thực sự cần làm.

object.dock = Fill
Panel.Controls.Add(object)

0

Tôi biết đây là một bài viết cũ nhưng tôi phát hiện ra một cái gì đó hữu ích. Để điều chỉnh thứ tự kiểm soát anh chị em theo chương trình cho (các) điều khiển được tạo động, bạn có thể thực hiện một số thứ như:

parentForm.Controls.SetChildIndex (myPanel, 0) 

Trong trường hợp của tôi, tôi đã làm điều này để di chuyển bảng điều khiển Dock / Fill thành điều khiển đầu tiên trong biểu mẫu của mình để nó không trùng lặp với một điều khiển được gắn khác được đặt thành Dock / Top (một dải menu).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.