2009-03-06 19 views
12

Web içerik formum var ve içerik panelindeki bir kontrole erişmem gerekiyor. Ben kontrolünü erişmek için iki yoldan biliyorum:Web formunda bir kontrol bulun

  1. TextBox txt = (TextBox)Page.Controls[0].Controls[3].Controls[48].Controls[6]
  2. tüm kontroller tarayan bir özyinelemeli fonksiyon yazarak.

Page.FindControl bu durumda çalışmadığından, başka herhangi bir kolay yol var mı? Sormamın nedeni, Page nesnesinin veya Content Panel nesnesinin bir çocuk denetimini bulma yöntemine sahip olması gerektiğini hissettiriyor, ancak böyle bir şey bulamıyor.

cevap

26

Sorun, FindControl() şablonlu bir denetim gibi belirli denetim çocuklarını geçmemesidir. Eğer daha sonra kontrol ettiğinizde şablonda bulunmaz.

Bunun için aşağıdaki uzantı yöntemlerini ekledik. 3.5 kullanmıyorsanız veya uzantı yöntemlerinden kaçınmak istiyorsanız, bunların dışında genel amaçlı bir kütüphane oluşturabilirsiniz.

Artık kodlayarak sonra olan bir kontrol elde edebilirsiniz:

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

uzatma yöntemleri sizin için özyinelemeli işler yapmak. Bu yardımcı olur umarım!

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

Vay, bu p olmalıdır Çerçevenin sanatı! – Marcel

0
şöyle bir jenerik sitelerinden birine GetControls işlevini değiştirmek isterdiniz

:

: Sonra

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; 
} 

Ve

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

Bu şekilde, arayan gibi bir şey çağırır

var button = Page.GetControl<Button>("MyButton"); 
İlgili konular