2013-06-18 94 views
7

Tôi biết cách tìm và thu thập danh sách tất cả các điều khiển được sử dụng trong Biểu mẫu Windows. Something như thế này:Tìm các thành phần trên mẫu cửa sổ C# (không điều khiển)

static public void FillControls(Control control, List<Control> AllControls) 
{ 
    String controlName = ""; 
    controlName = control.Name; 

    foreach (Control c in control.Controls) 
    { 
     controlName = c.Name; 
     if ((control.Controls.Count > 0)) 
     { 
      AllControls.Add(c); 
      FillControls(c, AllControls); 
     } 
    } 
} 

Tuy nhiên chức năng này không lấy các thành phần không nhìn vào phía dưới của hình thức như HelpProvider, ImageList, TableAdapters, DataSets vv

Có cách nào để có được danh sách các thành phần này không?

Edit:

Cảm ơn @HighCore đã chỉ cho tôi sử dụng System.ComponentModel.Component thay vì trong một chức năng tương tự như không làm cho tôi một danh sách với các thành phần như vậy ImageList, các nhà cung cấp trợ giúp và BindingSource. Tuy nhiên, tôi vẫn bỏ lỡ danh sách này trong TableAdapters và DataSets. Tôi cho là bởi vì những người được kế thừa trực tiếp từ Object.

Vui lòng. Đừng giới thiệu tôi với các bài đăng cũ hơn cho thấy chức năng tương tự của tôi và chỉ nhận được danh sách các điều khiển.

Chỉnh sửa: Tại sao lại bỏ phiếu phủ định? Câu hỏi này chưa bao giờ được trả lời trước đây!

+0

Tôi không quen với winform, nhưng nếu những gì bạn đang tìm kiếm là 'Components' (I.E' System.ComponentModel.Component'), bạn nên sử dụng nó thay vì 'Control'. Và BTW hãy thay đổi mã foreach kinh khủng này thành một '.SelectMany()' –

+0

http://stackoverflow.com/questions/6736914/how-to-access-find-all-controls-and-all-components-into- form-in-c –

+1

Có thể trùng lặp: [Cách truy cập tìm tất cả các điều khiển và tất cả các thành phần thành dạng trong C#?] (http://stackoverflow.com/questions/6736914/how-to-access-find-all-controls- and-all-components-into-form-in-c) – SwDevMan81

Trả lời

12

Đáng ngạc nhiên, có vẻ như cách duy nhất để làm điều này là thông qua phản ánh.

private IEnumerable<Component> EnumerateComponents() 
{ 
    return from field in GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) 
      where typeof (Component).IsAssignableFrom(field.FieldType) 
      let component = (Component) field.GetValue(this) 
      where component != null 
      select component; 
} 
+0

Vâng, đây là người chiến thắng. Cảm ơn nhiều!! –

+1

Xin lỗi, tôi biết chủ đề này là cũ, nhưng tôi ngạc nhiên đây là cách duy nhất (và không-để-trực quan) nhận được các thành phần của một biểu mẫu. Cám ơn Craig vì câu hỏi và Michael cho câu trả lời. Điều này đã giúp tôi rất nhiều. – nurchi