2011-07-24 2 views
1

私は、テキストボックス、ドロップダウンリストなど、ページのユーザコントロール内にあるような、自分のコントロールにループすることができるかどうか尋ねたいと思います。シナリオは、私は 'Page.aspx'と呼ばれるページがあると仮定し、私は3つのユーザーコントロールをpage(uc1, uc2 and uc3)とそれぞれのユーザーコントロールのすべてのこれらのコントロールを含むASPパネル(名前PnlTab1)があります。 私は私のコントロールに到達するためにそのコードを使用しています:マルチユーザーコントロールで、コントロールのループ方法は?


  UserControl uc1, uc2, uc3; 
      uc1 = usercontrol1; 
      uc2 = usercontrol2; 
      uc3 = usercontrol3; 

      foreach (Control c in uc1.FindControl("PnlTab1").Controls) 
      { 
       if (c is TextBox) 
        ((TextBox)c).Enabled = true; 
      } 

      foreach (Control c in uc2.FindControl("PnlTab1").Controls) 
      { 
       if (c is TextBox) 
        ((TextBox)c).Enabled = true; 
      } 
      foreach (Control c in uc3.FindControl("PnlTab1").Controls) 
      { 
       if (c is TextBox) 
        ((TextBox)c).Enabled = true; 
      } 

は今、私は毎回「foreach (Control c in uc3.FindControl("PnlTab1").Controls」を書きたくはありません。再帰的に行うことはできますか?

ありがとうございました!

答えて

0

再帰の必要はありません、ちょうど別のループ:

UserControl[] ucs = new UserControl[3]{ 
     usercontrol1, 
     usercontrol2, 
     usercontrol3 
    }; 
    foreach (UserControl uc in ucs){ 
     foreach (Control c in uc.FindControl("PnlTab1").Controls) 
     { 
      if (c is TextBox) 
       ((TextBox)c).Enabled = true; 
     } 
    } 
+0

あなたの答え、Tim、DaveとTheGeekYouNeedに感謝します。 – enginbilici

+0

ユーザーコントロールを配列として宣言することはできません。私はこれを試してみると非常に多くのエラーが発生します。残念ながら、私は自分のプログラムにリモートで接続しており、接続に問題があります。私は明日これをもう一度試みます。あなたの答えのTimに感謝します。 – enginbilici

+0

申し訳ありませんが、私はそこに戻りました。この新しい構文は正しいはずです。 – Dave

1

ここでは再帰的に行う方法の例を示します。あなたのコントロールのコンテナで

パス(ページが有効なコントロールである)

public static void DisableAllChildServerControls(Control ctrl, bool disable) 
    { 
     foreach(Control c in ctrl.Controls) 
     { 
      if (c is TextBox) 
      { 
       TextBox t = c as TextBox; 
       t.Enabled = !disable; 
       if (t.ID == "txtRefundedAmount") 
        t.Enabled = true; 
      } 
      else if (c is DropDownList) 
      { 
       DropDownList d = c as DropDownList; 
       d.Enabled = !disable; 
      } 
      else if (c is Button) 
      { 
       Button b = c as Button; 
       b.Enabled = !disable; 
      } 

      if(c.Controls.Count > 0) 
      { 
       DisableAllChildServerControls(c, disable); 
      } 
     } 
    } 
+0

ありがとうあなたの答えについては、私は私のリモート接続のためのいくつかの接続の問題を持っている、と私は後で再びそれをしようとします。私は結果を共有します。もう一度、ありがとう! – enginbilici

1

.NETは(私の知る限り)再帰的にFindControlをサポートしていませんが、それは自分で実装することができます。スティーブ・スミスは1を持っています

// uc3 has id = "UserControl1" 
TextBox tb = FindControl<TextBox>(UserControl1, "PnlTab1"); 
if (tb != null) 
{ 
    tb.Enabled = true; 
} 

は、彼の記事を見て、それはあなたのニーズに合うかどうかを確認:あなたのような何かができるよう Recursive FindControl

それは、ジェネリックを使用して追加の利点を持っています。

+0

あなたの答えをありがとう、私は私のリモート接続のためのいくつかの接続の問題があり、私は後でそれを再試行します。私は結果を共有します。もう一度、ありがとう! – enginbilici

+0

あなたは大歓迎です:) – Tim

関連する問題