【问题标题】:Access an existing main winform instance from any child form从任何子窗体访问现有的主 winform 实例
【发布时间】:2013-08-21 20:09:40
【问题描述】:

我正在使用 WinForm 应用程序。我有几个表格。我希望能够从任何子表单访问我的主表单。我能够通过自定义按钮功能做到这一点并捕获 Form_Closing 事件。我有一个问题,我将在下面解释。

主窗体代码如下:

ChildForm form = new ChildForm(); // Create new Child Form instance
form.Show(); // Show Child form
this.Hide(); // Hide Main form

使用“this.Hide();”意味着主窗体仍然存在于内存中并且仍在工作,它只是隐藏了这就是我想要的。

子窗体上的代码

MainForm form = new MainForm(); // Create new Main Form instance
form.Show(); // Show Main Form
this.Close(); // Close Child Form

这一切都很好,除了我的第二个代码块(直接在上面的子表单),第一行代码创建了主表单的新实例。那是我的问题,我不想创建该表单的新实例,我想显示已经存在的隐藏实例(我在上面的第一个代码块中隐藏的主表单)。

我在子表单上尝试了以下代码:

this.Parent.Show();

但是我收到了这个运行时错误消息: “System.NullReferenceException 未处理:Message=Object 引用未设置为对象的实例”。

我理解错误的含义,我只是没有创建对该主窗体的对象引用或如何以任何方式引用它的代码。

有什么建议吗?

先谢谢了。

【问题讨论】:

  • 通过构造函数form2(IWin32Window parent)传递表单引用

标签: c# winforms


【解决方案1】:

您可以为其他表单创建一个构造函数,将窗口作为参数

private Form MyParent { get; set; }
public Form1(Form parent)
{
   MyParent = parent;
}

MyParent.Show();

其中MyParent 是表单的属性

您可以通过new ChildForm(this)拨打此电话


编辑

我只是看了看,不知道为什么我不能为 IWin32Window 使用构造函数,但 Show 有一个重载,其中会将 Owner 设置为父表单

new ChildForm().Show(this);
ChildForm.Owner //returns MainForm (parent)

【讨论】:

  • 该行 'this.ParentForm = parent' 出现 2 个语法错误,第一个错误表明属性 'ParentForm' 是只读的。第二个错误是它不能从 'System.Windows.Forms.IWin32Window' 隐式转换为 'Sytem.Windows.Forms.Form' ,存在显式转换。
  • 哦,对不起,我没有意识到已经有一个父表单参数(我的意思是它是您创建的属性),但我发现第二个参数令人惊讶......你可以使用Form in IWin32Window 的位置.. 我会尝试找出原因
  • @Sayse 也许您不能使用 IWin32Window 因为它不受管理?没用过,但是看起来像WinApi类而不是.Net
  • @MichaelCwienczek - 我做了一个测试,我相信这是因为继承,所有表单都是 iwin32windows,但并非所有 win32windows 都是表单..IWin32Window f = new Form() 有效,但 Form f = new IWin32Window() 没有
【解决方案2】:

应该这样做。因为这些是单线程表单,所以该函数将等到您关闭表单后再继续。

ChildForm form = new ChildForm(); // Create new Child Form instance
this.Hide(); // Hide Main form
form.ShowDialog(); // Show Child form, wait for closing
this.Show();

您还可以将 ChildForm 关闭事件附加到 MainForm 中的功能。

public MainForm()
{
    ChildForm form = new ChildForm();
    form.FormClosed += OnClosed;  
}
public void OnClosed(object sender, EventArgs e)
{
     this.Show();
}

【讨论】:

  • 谢谢!这已经奏效了。如果你有这方面的知识,有时事情会变得多么简单,这让我感到惊讶。这回答了我的问题。谢谢。 (我该如何回答我的问题?:))
  • @YousefImran 帖子左侧有一个复选标记的轮廓。点击它接受答案。
猜你喜欢
  • 2011-07-23
  • 2014-03-31
  • 1970-01-01
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多