c# - 自动关闭显示对话框

标签 c# winforms

我有两个表单,Form1 和 Form2。当程序运行时,Form1 是启动的窗体。然后我想调用Form2,将其显示在Form1前面,在Form2中做一些事情,然后在没有任何输入的情况下自动关闭Form2,以便用户可以继续使用Form1。

我尝试过以下方法:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        Form2 otherForm = new Form2();
        otherForm.ShowDialog();

        //do more stuff here after Form2 has opened and closed
    }
}

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();

        //do some stuff here

        this.Close();
    }
}

当我尝试此操作时,我收到一个 ObjectDisposeException,其中包含消息“无法访问已处置的对象”。我尝试在互联网上搜索,但没有找到任何东西。我尝试过使用 this.Dispose() 代替,以及使用 .Show() 代替 .ShowDialog()。我想要以这种方式完成的事情可能吗?

我曾考虑过让 Form2 成为它自己的 .exe 并调用 .exe 作为替代方案,但我想在重写所有内容之前我应该​​询问 StackOverflow 的专家。

最佳答案

正如 Markus 所提到的,因为您的 Form2 构造函数调用 this.Close(),一旦出现 Form2 otherForm = new Form2 行,Form2 窗口就已经关闭(); 结束。

close() 方法除了关闭窗口(以及任何拥有的窗口)之外还释放资源。因此,在下面的行中,当调用 otherForm.ShowDialog(); 时,它无法访问 otherForm (已被释放)并抛出 ObjectDispositedException 。这解释了您遇到异常的原因。

要修复此问题,请从 Form2 构造函数中删除 this.Close()。您仍然需要调用 close() 方法,但要在构造函数之外以及在 Form2 中完成您想要做的事情之后进行。

例如:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        Form2 otherForm = new Form2();
        otherForm.Show(this);
        otherForm.DoStuff();

        //do more stuff here after Form2 has opened and closed
    }
}

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    public void DoStuff()
    {
        // do stuff here as you wish
        // close method goes here
    }
}

关于c# - 自动关闭显示对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48937694/

相关文章:

winforms - 如何在 WinForm 线程上获取 WinForm 同步上下文或调度

c# - 如何强制文本框只接受 2.1 到 9.5 之间的数字

c# - 从值元组创建子元组

c# - 创建 Photoshop 风格的 float 工具调色板

c# - 从坐标列表中提取运动数据

c# - 何时覆盖 GetHashCode()?

c# - 防止Win32绘制经典标题栏

c# - 使用相同的事件处理程序处理多个事件

c# - Bot Framework Composer - 读取应用程序设置

c# - 为什么我的 .NET 组件上的索引器并不总是可以从 VBScript 访问?