2011-06-23 20 views
5

私は、次の方法があります。その後、私はこれでそれを呼ばコントロールが正しく処分されていませんか?

public static void Disposer(Control.ControlCollection controls) 
    { 
     foreach (Control c in controls) 
     { 
      if (c.HasChildren) 
       Disposer(c.Controls); 

      if ((c is UltraNumericEditor) 
       || (c is UltraComboEditor) 
       || (c is UltraTextEditor) 
       || (c is UltraDateTimeEditor) 
       || (c is UltraCheckEditor) 
       || (c is UltraGrid) 
       || (c is UltraStatusBar)) 
      { 
       c.Dispose(); 
       var x = c.IsDiposed; // this is true! 
      } 

     } 
    } 

を:

[STAThread] 
    static void Main() 
    { 
     Test forma = new Test(); 
     forma.Controls.Add(new UltraStatusBar()); 
     forma.Controls.Add(new UltraStatusBar()); 
     forma.Controls.Add(new UltraNumericEditor()); 
     forma.Controls.Add(new UltraComboEditor()); 
     forma.Controls.Add(new UltraTextEditor()); 
     forma.Controls.Add(new UltraTextEditor()); 
     forma.Controls.Add(new UltraDateTimeEditor()); 
     forma.Controls.Add(new UltraTimeZoneEditor()); 
     forma.Controls.Add(new UltraGrid()); 

     Disposer(forma.Controls); 

     foreach (Control control in forma.Controls) 
     { 
      if (control.IsDisposed)//this is false now! 
      { 
       Debug.Write(control.Name + " was disposed"); 
      } 
     } 
    } 

私の質問は、なぜ私のディスポーザーメソッド内で自分のコントロールが配置になっているが、私は、チェックイン時にメインメソッドはfalseを返していますか? ところで、 "テスト"オブジェクトはUserControlから継承する単純なクラスです ありがとうございます。

+0

コードはコンパイルされません。 'System.Windows.Forms.Control'クラスは、' Dispose() 'メソッドを公開しません(ただし、' IsDisposed'を公開します)。 –

+1

@EdSあなたは本当ですか? –

+3

@Edはいはいいいえhttp://msdn.microsoft.com/en-us/library/system.windows.forms.control.dispose.aspx –

答えて

6

Control.ControlCollectionクラスにバグがあります。 foreachループでコレクションを変更すると、他のコレクションクラスが生成するInvalidOperationExceptionを生成するコードがありません。

Dispose()を呼び出すと、Controlsコレクションからコントロールが削除されます。実際には、他のすべてのコントロールを処分するだけです。

制御し、ポイントの自宅を駆動するものを処分するより良い方法は、次のとおりです。

while (controls.Count > 0) controls[0].Dispose(); 

逆方向に動作のための()ループを使用しないことは困難であるが。このコードはほとんどの場合不要ですが、Winformsは自動的にコントロールを破棄します。また、コントロールのCreateControl()メソッドがまだ呼び出されていないため、何も配置する必要はありません。コンテナフォームのShow()メソッドが呼び出されて完了するまでは起こりません。 Controls.Remove()またはControls.Clear()メソッドを呼び出すときには、自分でコントロールを破棄します。

+0

あなたは強調のための小さな編集を気にしないでほしい;) –

+0

申し訳ありません、最後に追加された文との互換性がありません。 –

+0

ShowDialog()を使用して呼び出すとどうなりますか? ? – hyeomans

関連する問題