我的控件没有得到正确处理
本文关键字:正确处理 控件 我的 | 更新日期: 2023-09-27 18:00:26
我有以下方法:
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!
}
}
}
然后我这样称呼它:
[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");
}
}
}
我的问题是,为什么在我的Disposer方法中,我的控件被处理了,但当我签入main方法时,却返回false??顺便说一句,"Test"对象只是一个从UserControl继承的简单类顺致谢意
Control.ControlCollection类中存在错误。它缺少生成InvalidOperationException的代码,当您在foreach循环中修改集合时,其他集合类会生成该代码。
调用Dispose()将从Controls集合中删除一个控件。实际上,您只处理其他所有控件。
处理控件的更好方法是:
while (controls.Count > 0) controls[0].Dispose();
尽管很难不使用向后工作的for()循环。这些代码几乎总是不必要的,Winforms会自动处理控件。并且不需要任何处理-控件的CreateControl()方法尚未被调用。直到容器窗体调用并完成其Show()方法后,才会发生这种情况。只有在调用controls.Remove()或controls.Clear()方法时才自行处理控件。