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

あなたのバージョンはかなり似ています。きちんとした解決策。 –

答えて

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時間の各レンダリングを使用して)あなたはこれが最適になると思いますか? –

関連する問題