2009-08-05 48 views
1

我需要枚举一组控件 - 不管它们的嵌套级别如何 - 匹配给定的谓词。查找与谓词相匹配的所有ASP.NET控件?

最初出现问题,当我需要将网格行中的所有文本框设置为ReadOnly时,如果该行中的列表示该记录不应该可编辑。

后来我意识到,我已经解决了过去很像这个问题,只用不同的标准(通过它的ID递归地查找单个控件)。

尝试了几个选择后,我想出了一个通用的解决方案。但由于我经常使用这种方法,我想收集可能的改进。

此方法将返回匹配的谓语所有子控件:

public static IEnumerable<T> FindChildControls<T>(this Control parentControl, 
    Predicate<Control> predicate) where T : Control 
    { 
     foreach (Control item in parentControl.Controls) { 
      if (predicate(item)) 
       yield return (T)item; 

      foreach (T child in item.FindChildControls<T>(predicate)) { 
       yield return child; 
      } 
     } 
    } 

使用这种方法,我可以做到以下几点:

var allTxt = Page.FindChildControls<TextBox>(c => c is TextBox); 
var submit = Page.FindChildControls<Button>(c => c.ID == "btnSubmit").First(); 
+0

我更喜欢你的版本!整洁的解决方案。 – 2009-08-05 20:08:19

回答

5

您可以使用一个队列摆脱递归的,如果你想。

 public static IEnumerable<T> FindChildControls<T>(Control parentControl, 
     Predicate<Control> predicate) where T : Control 
     { 
      Queue<Control> q = new Queue<Control>(); 

      foreach (Control item in parentControl.Controls) 
      { 
       q.Enqueue(item); 
      } 

      while (q.Count > 0) 
      { 
       Control item = q.Dequeue(); 
       if (predicate(item)) 
        yield return (T)item; 

       foreach (Control child in item.Controls) 
       { 
        q.Enqueue(child); 
       } 
      } 

     } 
+0

这实际上非常整洁,在我的情况下(重页控制树和每个渲染大约4-5次使用),你认为这将是最优的吗? – 2009-08-05 15:57:56

相关问题