簡體   English   中英

C#不像我告訴它那樣處理控件

[英]C# Not Disposing controls like I told it to

我有一個面板控件。 在面板內部,用戶可以添加組合框,文本框的標簽等並將其拖到其他東西上,並且我的窗體上有一個“刪除”按鈕,如果單擊該按鈕,它將刪除該面板內的所有控件。 但是此代碼:

foreach( Control control in panel.Controls )
{
     control.Dispose();
}

... 不能正常工作。 並非總是處理面板內的所有控件。 有時它擺脫了大多數,有時它僅僅擺脫了一兩個。 有時,除了1之外的所有東西都已處置。 WTF?

編輯:


這是我用來將控件添加到面板中的代碼:

 button1_Click(object sender, EventArgs e) { TextBox tbox = new TextBox(); tbox.Multiline = true; tbox.IsAccessible = true; panel.Controls.Add(tbox); } 

Dispose()僅清除非托管資源(盡管Paul Williams在注釋中指出,它通常比這更復雜!),因此它可能會或可能不會對您的情況有用。

嘗試使用RemoveAt(i)方法而不是Dispose()刪除控件:

for(int i = panel.Controls.Count-1; i >= 0; i--)
{
    panel.Controls.RemoveAt(i);
}

刪除所有控件的一種更簡單的方法是:

panel.Controls.Clear();

編輯:感謝Pieter和Paolo,像這樣調用Clear()會泄漏內存,因為控件沒有被釋放,所以這不是一個好習慣。

之前我已經看到過,您正在從集合中刪除使集合本身變小的項目。 例如,如果集合中有5個項目,當您向下移動該集合時,您比預期的更快到達列表末尾,因為您發布的每個Dispose()都會使列表變小。

我知道這是一篇很老的文章,但希望對您有所幫助。

我發現可行的唯一方法是:

while(panel.Controls.Count > 0)
{
    panel.Controls[0].Dispose();
}

這樣,控件列表在循環中間變小無關緊要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM