[英]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.