2011-12-21 44 views
10

Tôi đang tìm một ví dụ về mã làm thế nào để có được tất cả trẻ em kiểm soát của cha mẹ.Làm thế nào để có được tất cả trẻ em của một kiểm soát cha mẹ?

Tôi không biết làm cách nào.

foreach (Control control in Controls) 
{ 
    if (control.HasChildren) 
    { 
    ?? 
    } 
} 
+0

Câu hỏi của bạn không rõ ràng. Làm thế nào để bạn muốn 'có được' những điều khiển, nhìn thấy như thế nào bạn đã biết làm thế nào để lặp qua chúng? –

+0

Bạn đã lặp lại các trẻ em với vòng lặp foreach. Ít nhất là trẻ em của This.Controls, có lẽ là hình thức. Nó không phải là nếu không rõ ràng những gì bạn có nghĩa là với "kiểm soát cha mẹ". –

Trả lời

15

Nếu bạn chỉ muốn những đứa trẻ ngay lập tức, sử dụng

... 
var children = control.Controls.OfType<Control>(); 
... 

Nếu bạn muốn tất cả điều khiển từ hệ thống phân cấp (ví dụ, tất cả mọi thứ trong cây dưới một sự kiểm soát nhất định), sử dụng:

private IEnumerable<Control> GetControlHierarchy(Control root) 
    { 
     var queue = new Queue<Control>(); 

     queue.Enqueue(root); 

     do 
     { 
      var control = queue.Dequeue(); 

      yield return control; 

      foreach (var child in control.Controls.OfType<Control>()) 
       queue.Enqueue(child); 

     } while (queue.Count > 0); 

    } 

Sau đó, bạn có thể sử dụng một cái gì đó như thế này trong một hình thức:

private void button1_Click(object sender, EventArgs e) 
    { 
     /// get all of the controls in the form's hierarchy in a List<> 
     var controlList = GetControlHierarchy(this).ToList(); 

     foreach (var control in controlList) 
     { 
      /// do something with this control 
     } 
    } 

Lưu ý rằng .ToList() sẽ đánh giá toàn bộ Enumerable ngay lập tức, mà loại bỏ bất kỳ lợi ích perf bạn có thể nhận được từ việc thực hiện coroutine.

4

Controls có một bộ sưu tập MyControl.Controls mà bạn có thể làm một foreach trên.

Mỗi Kiểm soát cũng có thuộc tính Parent cung cấp cho bạn quyền kiểm soát của phụ huynh.

Bạn có thể viết phương pháp đệ quy nếu bạn cần giảm số lượng cấp độ không xác định.

2

Có lẽ nó có thể hữu ích cho ai đó:

public void GetControlsCollection(Control root,ref List<Control> AllControls, Func<Control,Control> filter) 
{ 
    foreach (Control child in root.Controls) 
    { 
     var childFiltered = filter(child); 
     if (childFiltered != null) AllControls.Add(child); 
     if (child.HasControls()) GetControlsCollection(child, ref AllControls, filter); 
    } 
} 

Đây là hàm đệ quy để có được những bộ sưu tập của các điều khiển với khả năng appling lọc (ví expample theo loại). Và ví dụ:

List<Control> resultControlList = new List<Control>(); 
GetControlsCollection(rootControl, ref resultControlList, new Func<Control,Control>(ctr => (ctr is DropDownList)? ctr:null)); 

Nó sẽ trả lại tất cả dropdownlists trong rootControl và tất cả các con của ông

0

Có lẽ quá phức tạp, nhưng sử dụng LINQ và một số ý tưởng từ trên cao/nơi khác:

public static IEnumerable<Control> GetAllChildren(this Control root) { 
     var q = new Queue<Control>(root.Controls.Cast<Control>()); 

     while (q.Any()) { 
      var next = q.Dequeue(); 
      next.Controls.Cast<Control>().ToList().ForEach(q.Enqueue); 

      yield return next; 
     } 
    } 
Các vấn đề liên quan