我写的程序包括一个控制台。我创建了一个名为Console的UserControl
。此Console类具有多个执行各种任务的后台工作程序。我遇到的问题是,如果我将此控件放在窗体上然后关闭它,我偶尔会遇到BackgroundWorker
线程调用已处置对象的问题。
基于this thread,我需要停止表单关闭并自己处理关闭请求。我已经成功写了大部分内容,但我遇到的主要问题是订阅了ParentForm
的{{1}}事件。
我一直在尝试使用FormClosing
,但我无法找到一个不存在空位的好地方。
当然,我无法在构造函数中执行此操作,因为此时正在生成它。
我也无法在this thread中提及的this.ParentForm
事件中使用此功能。触发此操作后,ParentChanged
不再为空,但不是this.Parent
。我有时会意识到它可能是,但是,例如,我目前坐在一个标签控件中,这不是我想要的。
然后我们还有this suggestion尝试挂钩this.ParentForm
函数(我引用第二个答案,而不是选中的答案)但是this.Load
在此处为空。和以前一样,this.ParentForm
有一个值,但它不是我想要的。
最后,当我遇到this thread建议覆盖this.Parent
时,我认为我找到了问题的解决方案,但又一次......没有运气,两者都是空的。
加载表单后,我添加了一个可以按下的按钮,此时,我已经确定OnCreateControl
实际上已正确填充。
我的问题 - 我在哪里可以获取this.ParentForm
UserControl
所在的this.ParentForm
,因此我可以订阅它的活动?
编辑:根据LarsTech的要求添加部分代码:
此代码的结果是:
This.Parent有一个值
This.ParentForm为null
private MyConsole(string COMPort)
{
// I do this so that the console window is created by the time I have started my Background Workers
this.CreateHandle();
// Generate the form
InitializeComponent();
// set the COM Port Name
_COMPort = COMPort;
ReadOnly = true;
ActiveCloseRequest = false;
// This just creates 1 or 2 background workers
StartBackgroundWorkers();
this.ParentChanged += MyConsole_ParentChanged;
}
void MyConsole_ParentChanged(object sender, EventArgs e)
{
if (this.Parent == null)
{
Console.WriteLine("This.Parent is null");
}
else
{
Console.WriteLine("This.Parent has a value");
}
if (this.ParentForm == null)
{
Console.WriteLine("This.ParentForm is null");
}
else
{
Console.WriteLine("This.ParentForm has a value");
}
}
答案 0 :(得分:0)
您是否尝试过在UserControl的Dispose()
方法中进行清理?这通常是一个更合乎逻辑的地方,因为表格结束将处理其子控件。
不幸的是,自动生成的用户控件模板将Dispose()
方法放在关联的.Designer.cs
文件中。但是您可以将方法移动到主文件中并修改它以执行清理。