2011-01-12 30 views
4

マスターページから継承されたasp.netページがあります。このページのすべてのコントロールをクリアしたいです。以下のメソッドを使用してみました。マスターページがあれば動作しません。それ以外の場合は、すべてのアイデアをうまく​​動作さマスターページでASP.NETページのすべてのコントロールをクリアする

private void ClearControls() 
{ 
    foreach(Control c in Page.Controls) 
    { 
     foreach (Control ctrl in c.Controls) 
     { 
      if (ctrl is TextBox) 
      { 
       ((TextBox)ctrl).Text = string.Empty; 
      } 
     } 
    } 
} 
+0

はあなたがページとそのマスターページの両方でのTextBoxをクリアしたい、またはそれは単にあなたのページときにテキストボックスをクリアしていないことを意味しませんでしたマスターページを使用していますか? – KBoek

+0

これはClearControls()をどこから呼び出すかと関係しているかもしれません... – KBoek

+0

MasterPageが存在するのはなぜですか?例外は何ですか? Page.Controlsについてのクイックウォッチは何を示していますか? – citronas

答えて

6

これを試してみてください。

public void FindAllTextBox(Control ctrl) 
{ 
    if (ctrl != null) 
    { 
     foreach (Control c in ctrl.Controls) 
     { 
      if (c is TextBox) 
       ((TextBox)c).Text = string.empty; 
      FindAllTextBox(c); 
     } 
    } 
} 

例:代わりにiscast

Control ctrl = this.FindControl("content"); 
FindAllTextBox(ctrl); 
+0

すべてのテキストボックスをクリアしたい –

+1

タイプを直接比較するのは悪い考えです。そのための演算子は 'as'と' is'です。はるかに速く、より適切に – abatishchev

+0

この機能ですべてのテキストボックスをクリアすることができます... FindAllTextBox(this); – ogun

0

まず、利用事業者as

TextBox tb = ctrl as TextBox; 
if (tb != null) 
{ 
    tb.Text = String.Empty; 
} 

次にTextBoxの代わりにITextControlを使用できます。

そして第三に、次の拡張メソッド試してください:

public static IEnumerable<T> GetChildControls(this Control control) where T : Control 
{ 
    var children = (control.Controls != null) ? control.Controls.OfType<T>() : Enumerable.Empty<T>(); 
    return children.SelectMany(c => GetChildControls(c)).Concat(children); 
} 

使用法:あなたはマスターページを追加するときにこれがあるため、あなたのコントロールである可能性があり

foreach (var c in this.Page.Controls.GetChildControls<TextBox>()) 
{ 
    c.Text = String.Empty; 
} 
1

を別の容器の内側にあります。前に別のforeachを追加しようとしましたか?

private void ClearControls() 
{ 
    foreach(Control container in Page.Controls) 
    { 
     foreach (Control c in container.Controls) 
     {  
      foreach (Control ctrl in c.Controls) 
      {  
       if (ctrl is TextBox)   
       {   
        ((TextBox)ctrl).Text = string.Empty; 
       } 
      } 
     } 
    } 
} 

でも、私はそれをこのようにしないだろう。ハードコーディングがより良い場合があります。これは、多くのコントロールを含むページで呼び出されると、多くのリソースを使用します。

+0

'is'と' cast'の代わりに 'as'演算子を使用してください – abatishchev

+0

例外が発生するケースはありますか?私はそうは思わない。 – Pabuc

+0

を参照してください。http://stackoverflow.com/questions/2139798/why-is-the-c-as-operator-so-popular – abatishchev

1

ハードではないコードを実行します。

//Recursively get all the formControls underneath the current one, be it Page, UserControl or whatever. 
public static IEnumerable<Control> GetAllControls(this Control parent) 
{ 
    foreach (Control control in parent.Controls) 
    { 
     yield return control; 
     foreach (Control descendant in control.GetAllControls()) 
     { 
      yield return descendant; 
     } 
    } 
} 

次に、あなたがあなたのWebフォーム/コントロールでそれを呼び出すことができます。

var formCtls = this.GetAllControls().OfType<TextBox>(); 
foreach(TextBox txtbx in formCtls) 
{ 
    //do what you gotta do ;) 

} 
0

を私は同じ問題を抱えていたが、私はそれがあまりにも硬くなっていたと思います。私はAJAX UpdatePanelコントロールを使用していますが、私はMasterPageまでずっとそれを参照しました。これは私のために働いた。

 foreach (Control c in UpdatePanel1.Controls) 
     { 
      foreach (Control c1 in c.Controls) 
      { 
       if (c1 is TextBox) 
       { 
        TextBox txtBox = (TextBox)c1; 
        txtBox.Text = "0"; 
       } 
      } 
     } 
0

ただ、パネル内のコントロールを維持し、このようなあなたの.csファイルにメソッドを作る

foreach (Control cntrl in pnl.Controls)//pnl is panel id 
       { 
        if (cntrl is TextBox) 
        { 
         TextBox txtBox = (TextBox)cntrl; 
         txtBox.Text = " "; 
        } 
       } 
0

以下のコードを試してください:呼び出し

//Where "this" is Page. 
ClearInput(this); 

private void ClearInput(Control parent) 
{ 
    foreach (Control c in parent.Controls) 
    { 
      if (c.Controls.Count > 0) 
       ClearInput(c); 
      else 
      { 
       if (c is TextBox) 
        (c as TextBox).Text = ""; 

       if (c is CheckBox) 
        (c as CheckBox).Checked = false; 

       if (c is DropDownList) 
        (c as DropDownList).SelectedIndex = 1; 
      } 
     } 
    } 
+0

は、マスターページ上のページにあるコントロールでこれを使用すると動作しません。 – Nitesh

0
 private void EnableControls(Control control) 
     { 
      var textbox = control as TextBox; 
      if (textbox != null) 
      { 
       textbox.Enabled = true; 
      } 

      var dropDownList = control as DropDownList; 
      if (dropDownList != null) 
      { 
       dropDownList.Enabled = true; 
      } 

      var radioButton = control as RadioButton; 
      if (radioButton != null) 
      { 
       radioButton.Enabled = true; 
      } 

      var checkBox = control as CheckBox; 
      if (checkBox != null) 
      { 
       checkBox.Enabled = true; 
      } 

      foreach (Control childControl in control.Controls) 
      { 
       EnableControls(childControl); 
      } 

     } 
+0

いくつかの説明は、この記事を読んでいる人が後でそれを理解するのを助けて、それがなぜ提起された質問に対する答えかもしれないのを助けるためにここでうれしいでしょう。 –

0
public void getAllCtl(ControlCollection ctls) 
    { 

     foreach (Control c in ctls) 
     { 
      if (c is System.Web.UI.WebControls.TextBox) 
      { 
       //TextBox tt = c as TextBox; 
       ////to do something by using textBox tt. 
       ((TextBox)c).Text = string.Empty; 
      } 
      if (c is System.Web.UI.WebControls.CheckBox) 
      { 
       ((CheckBox)c).Checked = false; 
      } 
      if (c is System.Web.UI.WebControls.DropDownList) 
      { 
       ((DropDownList)c).SelectedIndex = -1; 
      } 
      if (c.HasControls()) 
      { 
       getAllCtl(c.Controls); 

      } 
     } 

    } 

aspx.csファイルに

 getAllCtl(this.Form.Controls); 

これはすべてのマスター - チャイルドページと、複数のコントロールがページに含まれている場所でテストされています...

1

あなたはPage.Form.FindControl("ContentPlaceHolder1").Controlsでこれを行うことができる必要があります:

foreach (Control item in Page.Form.FindControl("ContentPlaceHolder1").Controls) 
{ 
    if (item is TextBox) 
    { 
     ((TextBox)item).Text = string.Empty; 
    } 
} 
関連する問題