我正在与旧的“错误创建窗口句柄”有趣。我的应用程序有一个中心区域,可以承载用户当前正在进行的任何控制。当用户加载新控件时,我会销毁旧控件。或者至少我试着。当我运行任务管理器时,我惊恐地看到,随着新控件的加载,GDI对象的数量没有减少。这就是我正在做的(尝试)杀掉我已经完成的控制。计数器最后显示了一个巨大的数字,这似乎是正确的,但任务管理器中的GDI对象保持不变,直到达到10,000,然后一切都崩溃了。
private void RecursivelyKillYourself(Control C) {
if (C.Controls != null && C.Controls.Count > 0) {
List<Control> Controls = C.Controls.OfType<Control>().ToList();
C.Controls.Clear();
Controls.ForEach(c_inner => RecursivelyKillYourself(c_inner));
} else {
C.Dispose();
num++;
}
}
修改
已修复 - 必须确保正确创建工具提示。另外,正如评论员指出的那样,那种漫长的愚蠢的递归方法是不必要的。只需一个简单的Dispose即可。
坏
(new SMcMaster.TabOrderManager(this)).SetTabOrder(SMcMaster.TabOrderManager.TabScheme.AcrossFirst);
好
ToolTip T = new ToolTip();
T.SetToolTip(btnAddPropertyInvoice, "Add Properties");
components.Add(T);