Accessing ParentForm from UserControl
本文关键字:UserControl from ParentForm Accessing | 更新日期: 2023-09-27 18:09:43
我正在编写的程序包括一个控制台。我创建了一个名为Console的UserControl
。这个Console类有多个后台工作者执行各种任务。我遇到的问题是,如果我将此控件放在窗体上,然后关闭它,我偶尔会遇到BackgroundWorker
线程调用已处置对象的问题。
基于这个线程,我需要停止表单关闭和处理关闭请求自己。我已经成功地编写了大部分内容,但是我遇到的主要问题是订阅ParentForm
的FormClosing
事件。
我一直在尝试使用this.ParentForm
,但我找不到一个好地方,这不是null。
当然,我不能在构造函数中这样做,因为此时它正在生成。
我也不能在这个线程中提到的ParentChanged
事件中使用这个。当这个触发时,this.Parent
不再为空,但它不是this.ParentForm
。我意识到有时它可能是,但例如,我目前在一个选项卡控件中有这个,所以这不是我想要的。
然后我们也有这个建议,尝试挂钩到this.Load
函数(我引用第二个答案,而不是选择的一个),但再次,this.ParentForm
在这里是空的。和以前一样,this.Parent
有一个值,但它不是我想要的。
最后,我认为我找到了解决我的问题,当我遇到这个线程建议覆盖OnCreateControl
,但再次…运气不好,两个都是空的。
加载表单后,我添加了一个按钮,我可以按下,在这一点上,我已经能够确定this.ParentForm
实际上得到正确填充。
我的问题-我在哪里可以得到UserControl
的this.ParentForm
,它不是空的,所以我可以订阅它的事件?
。父节点有一个值
。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");
}
}
您是否尝试过在UserControl的Dispose()
方法内进行清理?这通常是一个更合乎逻辑的地方,因为窗体关闭将随后处置它的子控件。
不幸的是,自动生成的用户控件模板将Dispose()
方法放在关联的.Designer.cs
文件中。但是,您可以将该方法移到主文件中,并对其进行修改以执行清理。