从UserControl访问ParentForm

时间:2015-08-25 17:56:17

标签: c# winforms user-controls

我写的程序包括一个控制台。我创建了一个名为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");
    }
}

1 个答案:

答案 0 :(得分:0)

您是否尝试过在UserControl的Dispose()方法中进行清理?这通常是一个更合乎逻辑的地方,因为表格结束将处理其子控件。

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