2011-01-26 11 views
18
private void CleanForm() 
{ 
    foreach (var c in this.Controls) 
    { 
     if (c is TextBox) 
     { 
      ((TextBox)c).Text = String.Empty; 
     } 
    } 
} 

この方法は機能せず、コントロールはクリアされません。それはうまくコンパイルされますが、何もしません。フォーム内のすべてのテキストボックスのテキストをクリアするには?

アイデア?

+2

脇に、 'TextBox'の代わりに' TextBoxBase'を指定することもできます。それは自動的に複数行のテキストボックス、豊富なテキストボックスなどを含みます。 – Timwi

+1

また、 'TextBox'にキャストする必要もありません。 – SLaks

+0

このコードはそのまま動作しますが、各ステートメントの(this.Controls)がテキストボックスを持つ実際のコントロールであることを確認してください。たとえば、フォームがあり、tableLayoutPanelがあり、テキストボックスがtableLayoutPanel内のforeach(this.Controls内のvar c)は機能しません。foreach(tableLayoutPanel1.Controls内のvar c)でなければなりません。 – Hammy

答えて

4

あなたのテキストボックスは、おそらくパネルや他のコンテナの内側にあり、フォームの中には直接入っていません。

すべての子コントロールのControlsコレクションを再帰的にトラバースする必要があります。

+0

グループボックス内にあります。最高の行動方針は何でしょうか? –

+0

@sergio:関数を再帰的にする必要があります。 – SLaks

6

数週間前のような問題がありました。ブレークポイントを設定してthis.Controlsを深く見ていると、問題はその性質を明らかにします。すべての子コントロールを再帰的に処理する必要があります。

コードは次のようになります。あなたが最初にClearFormを呼び出すと、この中に渡すか、ページ

private void CleanForm() 
{ 
    traverseControlsAndSetTextEmpty(this); 
} 
private void traverseControlsAndSetTextEmpty(Control control) 
{ 

    foreach(var c in control.Controls) 
    { 
     if (c is TextBox) ((TextBox)c).Text = String.Empty; 
     traverseControlsAndSetTextEmpty(c); 
    } 
} 
4
private void CleanForm(Control ctrl) 
{ 
    foreach (var c in ctrl.Controls) 
    { 
     if (c is TextBox) 
     { 
      ((TextBox)c).Text = String.Empty; 
     } 

     if(c.Controls.Count > 0) 
     { 
      CleanForm(c); 
     } 
    } 
} 

(私はそれが「これは」あるものであると仮定します)。

57

私はラムダ:)

​​

幸運が好き!テキストボックス、チェックボックスのような形ですべてのコントロールをクリアするための

+2

すてきなサンプルコード! – TheGeekYouNeed

+0

私のために働かない。 : –

+0

@Alexbelek、使用しているドットネットのバージョンは何ですか? – Homam

2

そしてこの、ラジオボタン

あなたが欲しいの異なる種類を追加することができます。..

private void ClearTextBoxes(Control control) 
    { 
     foreach (Control c in control.Controls) 
     { 
      if (c is TextBox) 
      { 
       ((TextBox)c).Clear(); 
      } 

      if (c.HasChildren) 
      { 
       ClearTextBoxes(c); 
      } 


      if (c is CheckBox) 
      { 

       ((CheckBox)c).Checked = false; 
      } 

      if (c is RadioButton) 
      { 
       ((RadioButton)c).Checked = false; 
      } 
     } 
    } 
+0

それは素晴らしいですが、それを実装する方法ですか? – Nuno

+0

@Nunoメソッドフォームを送信する必要がありますまたはコントロールオブジェクトを渡すと保存 –

-1

ただ、これを試してみてください

private void button2_Click(object sender, EventArgs e) 
    { 

     textBox1.Text = ""; 
    } 
0

を使用します。

var t = Form.Controls.OfType<TextBox>().AsEnumerable<TextBox>(); 
foreach (TextBox item in t) 
{ 
    item.Text = ""; 
} 
+0

、私は次のメッセージが表示されます: "エラーCS0120非静的フィールド、メソッド、またはプロパティ 'Control.Controls'にオブジェクト参照が必要です – Nuno

2

拡張メソッドを改良/修正しました。

public static class ControlsExtensions 
{ 
    public static void ClearControls(this Control frm) 
    { 
     foreach (Control control in frm.Controls) 
     { 
      if (control is TextBox) 
      { 
       control.ResetText(); 
      } 

      if (control.Controls.Count > 0) 
      { 
       control.ClearControls(); 
      } 
     } 
    } 
} 
関連する問題