2009-03-06 41 views
12

Tôi có biểu mẫu nội dung web và cần truy cập điều khiển bên trong bảng điều khiển nội dung. Tôi biết trong hai cách để truy cập điều khiển:Tìm điều khiển trong biểu mẫu web

  1. TextBox txt = (TextBox)Page.Controls[0].Controls[3].Controls[48].Controls[6]
  2. Bằng cách viết một hàm đệ quy để tìm kiếm thông qua tất cả các điều khiển.

Có cách nào khác dễ dàng hơn, vì Page.FindControl không hoạt động trong trường hợp này. Lý do tôi hỏi là cảm thấy với tôi như đối tượng Trang hoặc đối tượng Bảng điều khiển Nội dung phải có phương pháp để tìm điều khiển con, nhưng không thể tìm thấy bất kỳ thứ gì giống như vậy.

Trả lời

26

Vấn đề là FindControl() không đi qua một số trẻ điều khiển nhất định chẳng hạn như điều khiển khuôn mẫu. Nếu kiểm soát bạn sau khi sống trong một mẫu, nó sẽ không được tìm thấy.

Vì vậy, chúng tôi đã thêm các phương pháp mở rộng sau đây để giải quyết vấn đề này. Nếu bạn không sử dụng 3.5 hoặc muốn tránh các phương pháp mở rộng, bạn có thể làm cho một thư viện mục đích chung trong số này.

Bây giờ bạn có thể nhận được sự kiểm soát bạn bằng cách mã hóa sau:

var button = Page.GetControl("MyButton") as Button; 

phương pháp Phần mở rộng làm công việc đệ quy cho bạn. Hi vọng điêu nay co ich!

public static IEnumerable<Control> Flatten(this ControlCollection controls) 
{ 
    List<Control> list = new List<Control>(); 
    controls.Traverse(c => list.Add(c)); 
    return list; 
} 

public static IEnumerable<Control> Flatten(this ControlCollection controls,  
    Func<Control, bool> predicate) 
{ 
    List<Control> list = new List<Control>(); 
    controls.Traverse(c => { if (predicate(c)) list.Add(c); }); 
    return list; 
} 

public static void Traverse(this ControlCollection controls, Action<Control> action) 
{ 
    foreach (Control control in controls) 
    { 
     action(control); 
     if (control.HasControls()) 
     { 
      control.Controls.Traverse(action); 
     } 
    } 
} 

public static Control GetControl(this Control control, string id) 
{ 
    return control.Controls.Flatten(c => c.ID == id).SingleOrDefault(); 
} 

public static IEnumerable<Control> GetControls(this Control control) 
{ 
    return control.Controls.Flatten(); 
} 
+1

Ồ, đây sẽ là p nghệ thuật của Framework! – Marcel

0

Tôi muốn thay đổi chức năng GetControls của bạn sang một chung như sau:

public static T GetControl<T>(this Control control, string id) where T:Control 
{ 
    var result = control.Controls.Flatten(c => (c.GetType().IsSubclassOf(typeof(T))) && (c.ID == id)).SingleOrDefault(); 
    if (result == null) 
     return null; 
    return result as T; 
} 

And Then,

public static Control GetControl(this Control control, string id) 
{ 
    return control.GetControl<Control>(id); 
} 

Bằng cách này, người gọi sẽ gọi một cái gì đó như:

var button = Page.GetControl<Button>("MyButton"); 
Các vấn đề liên quan