2011-06-23 11 views
5

Mam następujący sposób:Moje elementy sterowania nie są prawidłowo utylizowane?

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

     } 
    } 

Potem nazwał go z tym:

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

Moje pytanie brzmi, dlaczego w moim sposobie dysponenta moi kontrole są coraz wyrzucać, ale kiedy sprawdzić w główna metoda zwraca false? Przy okazji obiekt "Test" jest po prostu prostą klasą dziedziczącą po UserControl Dzięki, pozdrawiam.

+0

Twój kod nie będzie się nawet kompilował. Klasa 'System.Windows.Forms.Control' nie eksponuje metody" Dispose() "(mimo że eksponuje' IsDisposed'). –

+1

@EdS czy jesteś tego pewien? –

+3

@Ed Erm tak to robi http://msdn.microsoft.com/en-us/library/system.windows.forms.control.dispose.aspx –

Odpowiedz

6

Wystąpił błąd w klasie Control.ControlCollection. Brakuje kodu generującego wyjątek InvalidOperationException, który generują inne klasy kolekcji podczas modyfikowania kolekcji w pętli foreach.

To, co robisz, wywołanie Dispose() usuwa formant z kolekcji Controls. W efekcie pozbędziesz się tylko każdej innej kontroli.

Lepszym sposobem utylizacji elementów sterujących, który napędza Home Point jest:

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

chociaż trudno nie używać do() pętlę, która działa wstecz. Ten kod jest prawie zawsze niepotrzebny, WinForm automatycznie udostępnia kontrolki. I nic nie stoi na przeszkodzie, aby metoda CreateControl() kontrolki nie została jeszcze wywołana. Co nie stanie się, dopóki formularz kontenera nie zostanie wywołany i zakończona. Kontrolki należy jedynie unieszkodliwić, gdy wywołasz metodę Controls.Remove() lub Controls.Clear().

+0

Mam nadzieję, że nie masz nic przeciwko małej edycji ze względu na nacisk;) –

+0

Przepraszamy, niekompatybilny z dodanym ostatnim zdaniem. –

+0

Co powiesz na to, gdy zadzwonię do niego za pomocą ShowDialog(); ? – hyeomans

Powiązane problemy