2017-08-20 12 views
-1

私はこの方法を試してみました:フォーム内のすべてのテキストエリアを削除するには?

private void ClearTextBoxes() 
     { 
      Action<Control.ControlCollection> func = null; 

      func = (controls) => 
      { 
       foreach (Control control in controls) 
        if (control is TextBox) 
         (control as TextBox).Dispose(); 
        else 
         func(control.Controls); 
      }; 

      func(Controls); 
     } 

私もフォームを更新場合には、動作しませんです。

+1

各コントロールの 'Text'プロパティを" blank "に設定しようとしていますか? – gnivler

+1

誰がそのメソッドを削除すると何かを削除すると言う? –

+0

内容を削除する 'control.Text = String.Empty'それを削除するcontainer.Controls.Remove(control) – bradbury9

答えて

2

フォームからすべてのテキストエリアを削除する場合は、親のControlsコレクションから削除し、終了した時点でIDisposableを実装するオブジェクトに対してDisposeを呼び出して、所有するアンマネージリソースをただちに解放する必要があります。必要のないテキストボックスに対してDispose()を呼び出さない場合、GCが決定したときに清掃され、アプリケーションの実行の途中で、または最後に実行される可能性があります。ここでの違いは、Dispose()を明示的に呼び出すと、次回のGC実行時にオブジェクトの終了が実行されます。それ以外の場合、GCはオブジェクトを終了キューに入れ、別の実行でメモリを消去します。

すべてのテキストボックス領域を明示したい場合は、Clearメソッドを呼び出す必要があります。

private void ClearTextBoxes() 
     { 
      Action<Control.ControlCollection> func = null; 

      func = (controls) => 
      { 
       foreach (Control control in controls) 
        if (control is TextBox) 
         (control as TextBox).Clear(); 
        else 
         func(control.Controls); 
      }; 

      func(Controls); 
     } 
1

あなたは次にあなたがTextBox.Clear()インスタンスメソッドを使用する必要がありますTextBox内のすべてのテキストをクリアしようとしている場合。

public void ClearTextBoxes() 
{ 
    ClearTextBoxes(Controls); 
} 

private void ClearTextBoxes(Control.ControlCollection controls) 
{ 
    if(controls == null) 
     return; 
    foreach(var control in controls) 
    { 
     (control as TextBox)?.Clear(); 
     ClearTextBoxes(control?.Controls); 
    } 
} 

フォームからすべてのTextBoxオブジェクトを削除しようとしている場合は、ControlCollection.Remove(Control)インスタンスメソッドまたはControlCollection.RemoveAt(int)インスタンスメソッドを使用する必要があります。

public void RemoveTextBoxes() 
{ 
    RemoveTextBoxes(Controls); 
} 

private void RemoveTextBoxes(Control.ControlCollection controls) 
{ 
    if(controls == null) 
     return; 
    for(int i = 0; i < controls.Count; ++i) 
    { 
     var control = controls[i]; 
     if(control is TextBox) 
     { 
      controls.RemoveAt(i); 
     } 
     else 
      RemoveTextBoxes(control?.Controls); 
    } 
} 

我々が基になるコレクションを変更しているので、このケースでは、我々はforeachループを使用することはできません。

また、C#7を使用している場合は、プライベートメソッドをローカル関数として持つことができます。


編集:@KrzysztofLaで述べたようにTextBoxIDisposableを実装しているので、あなたがコレクションからそれを削除した後、あなたはおそらく(あなたがその特定のTextBoxで作業を行っていると仮定すると、それにあなたを処分を呼び出す必要があります)です。

+1

ループ内でDisposeを呼び出すと、ループが中断されます。これは、DisposeがほとんどすぐにGCを実行してアンマネージリソースを削除するために発生します。 – krzysztofla

関連する問題