2009-08-05 44 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

相關問題