2011-06-23 35 views
5

tôi có phương pháp sau đây:Điều khiển của tôi không được xử lý đúng cách?

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

     } 
    } 

Sau đó, tôi gọi nó với điều này:

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

Câu hỏi của tôi là, tại sao bên phương pháp tiêu hủy của tôi điều khiển của tôi đang trở nên vứt bỏ, nhưng khi tôi kiểm tra trong phương pháp chính là trở về sai ?? Bằng cách này, đối tượng "Thử nghiệm" chỉ là một lớp đơn giản kế thừa từ UserControl Cảm ơn, liên quan.

+0

Mã của bạn thậm chí sẽ không biên dịch. Lớp 'System.Windows.Forms.Control' không lộ ra phương thức' Dispose() '(mặc dù nó hiện ra' IsDisposed'). –

+1

@EdS bạn có chắc chắn không? –

+3

@Ed Erm có nó http://msdn.microsoft.com/en-us/library/system.windows.forms.control.dispose.aspx –

Trả lời

6

Có lỗi trong lớp Control.ControlCollection. Nó thiếu mã để tạo ra một InvalidOperationException mà các lớp sưu tập khác tạo ra khi bạn sửa đổi bộ sưu tập trong vòng lặp foreach.

Bạn đang làm gì, gọi Dispose() sẽ xóa một điều khiển khỏi bộ sưu tập Điều khiển. Trong thực tế, bạn chỉ vứt bỏ mọi điều khiển khác.

Một cách tốt hơn để xử lý các điều khiển, một trong những ổ đĩa nhà điểm, là:

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

mặc dù nó là khó khăn không phải để sử dụng một vòng lặp for() mà làm việc về phía sau. Mã này gần như luôn luôn không cần thiết, Winforms tự động loại bỏ các điều khiển. Và không có gì cần xử lý phương thức CreateControl() của control chưa được gọi. Điều này không xảy ra cho đến khi biểu mẫu vùng chứa đã có phương thức Show() được gọi và hoàn thành. Chỉ xử lý các điều khiển chính mình khi bạn gọi phương thức Controls.Remove() hoặc Controls.Clear().

+0

Hy vọng bạn không quan tâm đến một chỉnh sửa nhỏ để nhấn mạnh;) –

+0

Xin lỗi, không tương thích với câu cuối cùng được thêm vào. –

+0

Còn khi tôi gọi nó bằng ShowDialog(); ? – hyeomans

Các vấn đề liên quan