2008-09-30 26 views
128

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

Trả lời

275

Bố cục lắp đặt phụ thuộc vào số để kiểm soát anh chị em. Các nút điều khiển được gắn "nút lên", vì vậy điều khiển cuối cùng trong bộ sưu tập được cập nhật trước. Điều khiển được gắn đế chỉ xem xét bố cục của trước đây là anh chị em được cập nhật. Do đó việc kiểm soát với Dock = Fill phải là đầu tiên (trên cùng) theo thứ tự anh chị em ruột, nếu bạn muốn nó kiểm soát các dock khác. 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 vì thứ tự anh chị em không nhất thiết phải giống như 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ế.

Đường viền tài liệu cửa sổ (Xem -> Cửa sổ khác -> Đường viền tài liệu) cung cấp chế độ xem cây hữu ích cho thứ bậc và thứ tự kiểm soát và cho phép bạn thay đổi thứ tự kiểm soát của anh chị em.

Bạn cũng có thể thay đổi thứ tự anh chị em trực tiếp trong trình thiết kế theo trình đơn ngữ cảnh -> Đưa lên trước/Gửi lại, điều khiển di chuyển đầ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 sự phụ thuộc vào mô hình bố trí.

Với điều khiển vị trí cố định, vị trí 2D không phụ thuộc vào thứ tự anh chị em, nhưng khi điều khiển 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 lên trước/Gửi lại có ý nghĩa.

Bảng điều khiển lưu lượng bên trong hoặc bảng, thứ tự tạo sẽ xác định thứ tự hình ảnh của các điều khiển. Không có điều khiển chồng chéo. Vì vậy, mang đến trước/gửi 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 bố cục được gắn, việc đưa lên trước/gửi ngược lại có thể còn khó hiểu hơn vì nó xác định thứ tự lắp đặt, vì vậy "đưa lên trước" trên điều khiển gắn đế sẽ đặt điều khiển trong giữa của phụ huynh, thực hiện tất cả các điều khiển cạnh được gắn 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 trình đơn tất cả trên biểu mẫu và có vẻ như khi tôi gắn dải trình đơn 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 nó 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") bao gồm trên các dải. Vì vậy, nên kiểm soát Dock = Fill thực sự là anh chị em đầu tiên theo thứ tự? Tôi có đọc sai không? Tôi đang sử dụng 3.5 (2008). Sự thay đổi này có phải không? – jrsconfitto

+42

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 'Bring to Front'. – kristianp

+0

Tôi có 3 hộp nhóm bên trong một bảng điều khiển và giống như @Jugglingnutcase Tôi đã yêu cầu họ đặt hàng như: Dock.Fill, tiếp theo là Dock.Bottom và cuối cùng là Dock.Top, để có chúng được gắn đúng cách 3. Trong mọi trường hợp, bài đăng tuyệt vời! –

90

Nhấp chuột phải vào bảng điều khiển bằng Dock = Fill và nhấp vào 'Bring to Front'.

Điều này làm cho điều khiển này được tạo cuối cùng, 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

đơn giản, ơn trời, điều này đã thực sự được làm phiền tôi – smirkingman

+0

Làm cho cảm giác khi bạn nghĩ về nó. –

+0

Rất vui khi biết điều đó, cảm ơn! – LuckyLuke82

7

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 dock trên cùng của bạn và một hàng khác để lấp đầy 100% cho đáy của bạn. Đặt cả hai bảng bên trong để Điền, và bạn đã hoàn tất.

(TableLayout không mất một để làm quen, mặc dù.)

+1

TableLayout cũng chậm hơn so với conterols docking cho hiệu suất bố cục, đặc biệt nếu bạn có các usercontrol 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 điều gì đó mà người dùng trung bình sẽ thấy trong một 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ố trí, 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à như vậy, và hiệu suất có vẻ OK ...) –

+0

TableLayout khá nhẹ. Bạn sẽ không thấy các vấn đề hiệu suất nếu bạn chỉ đang đặt ra một vài điều khiển. – Tim

0

Đây là một thủ thuật mà làm việc cho tôi ..

Đặt mục trên và cho nó vào bến đầu.

Đặt bộ chia, và cũng gắn nó lên trên, sau đó đặt nó bị tắt (trừ khi bạn muốn thay đổi kích thước đầu).

Sau đó Đặt đối tượng Fill và đặt Docking to Fill. Các đối tượng sẽ ở dưới splitter.

+0

Bạn không cần sử dụng bộ tách để thực hiện công việc này. –

1

JacquesB đã có ý tưởng với đường viền tài liệu nhưng cấu trúc phân cấp không giải quyết được sự cố của tôi. Đ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 một phụ huynh.

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

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

5

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

Ví 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 đầu tiên

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

Tôi nhận được thông báo này sau nhiều lần thử và lỗi. – tzot

0

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

Ví 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; 
Các vấn đề liên quan