2011-06-23 17 views
5

tengo el siguiente método:¿Mis controles no están siendo eliminados correctamente?

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! 
      } 

     } 
    } 

Entonces me llamaron con esto:

[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"); 
      } 
     } 
    } 

Mi pregunta es, ¿por qué dentro de mi método Disposer mis controles se están eliminados, pero cuando puedo comprobar en el El método principal es regresar falso? Por cierto, el objeto "Prueba" es solo una clase simple que hereda de UserControl Gracias, saludos.

+0

Tu código ni siquiera compilará. La clase 'System.Windows.Forms.Control' no expone un método' Dispose() '(aunque expone' IsDisposed'). –

+1

@EdS ¿estás seguro? –

+3

@Ed Erm sí lo hace http://msdn.microsoft.com/en-us/library/system.windows.forms.control.dispose.aspx –

Respuesta

6

Hay un error en la clase Control.ControlCollection. Falta el código para generar una InvalidOperationException que otras clases de colección generan cuando modifica la colección en un bucle foreach.

Lo que está haciendo, llamando a Dispose() elimina un control de la colección Controls. En efecto, solo dispones de cualquier otro control.

Una mejor manera de disponer los controles, uno que impulsa el clavo, es:

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

aunque es difícil no utilizar un bucle for() que funciona al revés. Este código casi siempre es innecesario, Winforms elimina automáticamente los controles. Y nada necesita eliminarse. El método CreateControl() del control aún no ha sido llamado. Lo cual no ocurre hasta que se ha llamado y completado el formulario contenedora. Solo deseche los controles usted mismo cuando llame al método Controls.Remove() o Controls.Clear().

+0

Espero que no te importe una edición pequeña para enfatizar;) –

+0

Lo sentimos, es incompatible con la última oración agregada. –

+0

¿Qué sucede cuando lo llamo usando ShowDialog(); ? – hyeomans

Cuestiones relacionadas