Accessing ParentForm from UserControl

本文关键字:UserControl from ParentForm Accessing | 更新日期: 2023-09-27 18:09:43

我正在编写的程序包括一个控制台。我创建了一个名为Console的UserControl。这个Console类有多个后台工作者执行各种任务。我遇到的问题是,如果我将此控件放在窗体上,然后关闭它,我偶尔会遇到BackgroundWorker线程调用已处置对象的问题。

基于这个线程,我需要停止表单关闭和处理关闭请求自己。我已经成功地编写了大部分内容,但是我遇到的主要问题是订阅ParentFormFormClosing事件。

我一直在尝试使用this.ParentForm,但我找不到一个好地方,这不是null。

当然,我不能在构造函数中这样做,因为此时它正在生成。

我也不能在这个线程中提到的ParentChanged事件中使用这个。当这个触发时,this.Parent不再为空,但它不是this.ParentForm。我意识到有时它可能是,但例如,我目前在一个选项卡控件中有这个,所以这不是我想要的。

然后我们也有这个建议,尝试挂钩到this.Load函数(我引用第二个答案,而不是选择的一个),但再次,this.ParentForm在这里是空的。和以前一样,this.Parent有一个值,但它不是我想要的。

最后,我认为我找到了解决我的问题,当我遇到这个线程建议覆盖OnCreateControl,但再次…运气不好,两个都是空的。

加载表单后,我添加了一个按钮,我可以按下,在这一点上,我已经能够确定this.ParentForm实际上得到正确填充。

我的问题-我在哪里可以得到UserControlthis.ParentForm,它不是空的,所以我可以订阅它的事件?

编辑:根据LarsTech的要求添加一些我的代码: 这段代码的结果是:

。父节点有一个值

。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");
    }
}

Accessing ParentForm from UserControl

您是否尝试过在UserControl的Dispose()方法内进行清理?这通常是一个更合乎逻辑的地方,因为窗体关闭将随后处置它的子控件。

不幸的是,自动生成的用户控件模板将Dispose()方法放在关联的.Designer.cs文件中。但是,您可以将该方法移到主文件中,并对其进行修改以执行清理。