5

Trong ứng dụng cửa sổ của tôi sử dụng dải menu và nhiều vùng chứa bảng điều khiển, bảng điều khiển được hiển thị tùy thuộc vào tùy chọn menulàm cách nào để ẩn tất cả các bảng ở dạng cửa sổ?

ẩn tất cả các bảng bằng cách tự chuyển tên rất tốn thời gian, có cách nào để ẩn tất cả các bảng hoặc bất kỳ cách nào để có được tên của tất cả các bảng trong một hình thức ??

+0

tôi đã chỉnh sửa tiêu đề của bạn. Vui lòng xem, "[Câu hỏi có nên bao gồm" thẻ "trong tiêu đề của họ không?] (Http://meta.stackexchange.com/questions/19190/)", trong đó sự đồng thuận là "không, họ không nên". –

+0

Bạn đã xem xét việc sử dụng [foreach] (http://msdn.microsoft.com/en-us/library/ttw7t8t6 (v = vs.80) .aspx) loop? – Brian

Trả lời

8
foreach (Control c in this.Controls) 
{ 
    if (c is Panel) c.Visible = false; 
} 

Và thậm chí bạn có thể làm cho đệ quy đó, và vượt qua trong các ControlCollection thay vì sử dụng this.Controls:

HidePanels(this.Controls); 

... 

private void HidePanels(ControlCollection controls) 
{ 
    foreach (Control c in controls) 
    { 
     if (c is Panel) 
     { 
      c.Visible = false; 
     } 

     // hide any panels this control may have 
     HidePanels(c.Controls); 
    } 
} 
+0

Ninja'ed. Tôi đã viết mã đó ngay bây giờ. Vì vậy, bây giờ bạn có upvote của tôi. – Renan

+0

@Renan, cảm ơn rất nhiều bạn! –

+0

+1 để đánh tôi vào cú đấm: P – Brian

3

nó sạch để viết một cái gì đó giống như

foreach (Panel p in this.Controls.OfType<Panel>()) { 
    p.Visible = false; 
} 
1

Argh này! Tôi vừa viết mã! : P

Control[] aryControls = new Control[]{ controlnamehere1, controlnamehere2 }; 
foreach (Control ctrl in aryControls) 
{ 
    ctrl.Hide(); 
} 

Hoặc cách khác:

Control[] aryControls = new Control[]{ controlnamehere1, controlnamehere1 }; 
foreach (Control ctrl in aryControls) 
{ 
    ctrl.Visible = false; 
} 
+0

làm thế nào để bạn biết rằng kiểm soát có chứa panel1, button1? tại sao bạn tạo mảng Control [] mới, bộ nhớ của nó không hiệu quả, bạn đang cố gắng tìm hiểu thói quen xấu - để lãng phí bộ nhớ không cần thiết? –

+0

Chỉnh sửa rõ ràng hơn. Bây giờ bạn chỉ cần nhìn vào câu trả lời của tôi để được snarky? – Brian

5

Vì vậy, có lẽ bạn muốn để có được tất cả các điều khiển bất cứ nơi nào trên biểu mẫu, không chỉ điều khiển cấp cao nhất. Cho rằng chúng tôi sẽ cần chức năng ít helper tiện dụng này để có được tất cả các điều khiển con, ở mọi cấp độ, cho một điều khiển đặc biệt:

public static IEnumerable<Control> GetAllControls(Control control) 
{ 
    Stack<Control> stack = new Stack<Control>(); 
    stack.Push(control); 

    while (stack.Any()) 
    { 
     var next = stack.Pop(); 
     yield return next; 
     foreach (Control child in next.Controls) 
     { 
      stack.Push(child); 
     } 
    } 
} 

(Hãy thoải mái để làm cho nó một phương pháp mở rộng nếu bạn nghĩ rằng bạn muốn sử dụng nó đủ)

Sau đó, chúng tôi chỉ có thể sử dụng OfType vào kết quả đó để có được các điều khiển của một loại đặc biệt:.

var panels = GetAllControls(this).OfType<Panel>(); 
+0

Cách tốt nhất để sử dụng vòng lặp chứ không phải đệ quy (do đó tránh được tình trạng tràn ngăn xếp tiềm tàng, mặc dù nếu bạn quản lý phân cấp điều khiển sâu, bạn có thể lùi lại và tạm nghỉ ...)! Tôi nghĩ rằng nó có thể là một chút tốt hơn nếu bạn lấy trong các loại như chung chung và chỉ đẩy điều khiển phù hợp với loại yêu cầu trên stack. Có lẽ nó không cần thiết mặc dù, hrm .... – Joshua

+0

@ Joshua Điều đó sẽ không hoạt động. Điều gì nếu có một điều khiển người dùng ở cấp cao nhất với một bảng điều khiển trong đó. Bạn có muốn bảng điều khiển đó hay không? Nếu bạn làm vậy, bạn không thể lọc ra các bảng mà bạn đang tìm kiếm ngay lập tức, bạn cần phải làm điều đó ở cuối.Tất nhiên nếu bạn không muốn trả lại sự kiểm soát trừ khi nó, và tất cả các bậc cha mẹ của nó, là * tất cả * của loại được chỉ định, thì đó là một câu chuyện khác. Điều đó chắc chắn sẽ nhanh hơn (bạn nhìn qua rất nhiều điều khiển ít hơn), nhưng nó cũng rất khác nhau về kết quả. – Servy

+0

@Joshua Cũng lưu ý rằng tránh đệ quy không chỉ ngăn cản bất kỳ ngoại lệ SO có thể có, nó cũng chỉ nói chung hiệu suất hơn. Không phải bởi một * lớn * lề, nhưng đến một mức độ. Nó cũng ngăn chặn các dấu vết ngăn xếp lộn xộn khi gỡ lỗi hoặc xử lý các ngoại lệ. – Servy

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