2009-03-06 3 views
12

私はウェブコンテンツフォームを持っており、コンテンツパネル内のコントロールにアクセスする必要があります。すべてのコントロールを検索再帰関数を記述することによってウェブフォームでコントロールを探す

  1. TextBox txt = (TextBox)Page.Controls[0].Controls[3].Controls[48].Controls[6]
  2. :私は、コントロールにアクセスするには2つの方法を知っています。

Page.FindControlはこのインスタンスでは機能しないため、他に簡単な方法はありますか? 私が求めているのは、私がページオブジェクトのように感じるか、またはコンテンツパネルオブジェクトに子コントロールを見つける方法が必要ですが、そのようなものを見つけることができないからです。

答えて

26

FindControl()は、テンプレートコントロールなどの特定のコントロールの子をトラバースしないという問題があります。あなたの後のコントロールがテンプレート内にある場合、それは見つからないでしょう。

私たちはこれに対処するために以下の拡張メソッドを追加しました。 3.5を使用していない場合や、拡張メソッドを避けたい場合は、汎用ライブラリをこれらから作成することができます。

ここで符号化することにより、あなたが後にしているコントロールを取得することができます:

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

拡張メソッドは、あなたのための再帰的な作業を行います。お役に立てれば!

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

これはpです。フレームワークの芸術! – Marcel

0

次のように、私は一般的なものにあなたのGetControls機能を変更したい:

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; 
} 
をし、その後、

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

この方法では、呼び出し側が何か呼び出します。

var button = Page.GetControl<Button>("MyButton"); 
関連する問題