【问题标题】:Self-closing ShowDialog box自动关闭显示对话框
【发布时间】:2018-08-02 21:50:47
【问题描述】:

我有两个表格,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();
    }
}

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

我曾想过将 Form2 设为自己的 .exe 并调用 .exe 作为替代方案,但我想在重写所有内容之前先询问 StackOverflow 的专家。

【问题讨论】:

  • 您到底想在 Form2 上做什么?在构造函数中关闭它似乎适得其反。
  • form2 构造函数末尾的this.Close 是什么?把它拿出来。 ShowDialog 为您关闭表单
  • @orhtej2 Form2 是一个窗口,它将检查更新并提供实时状态。我有一个禁用的多行文本框,我在其中显示多行文本。我想检查更新,如果有更新下载更新,然后关闭检查更新窗口。
  • @pm100 ShowDialog 需要用户输入才能关闭。我不希望用户必须手动关闭窗口。我想在检查完更新后自己关闭它。

标签: c# winforms


【解决方案1】:

你必须打电话

//Do some stuff
this.close() 

稍后 - 不在构造函数中 - 但例如在 Form.Activated 事件中。

示例:

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

        var form2 = new Form2();
        form2.ShowDialog();

        //Stuff Done
        MessageBox.Show("Stuff Done");
    }
}


public partial class Form2 : Form {
    public Form2() {
        InitializeComponent();
        Activated += DoSomeStuff;
    }

    private async void DoSomeStuff(object sender, EventArgs e) {
        //Do You Stuff here
        await Task.Run(() => Thread.Sleep(2000));
        this.Close();
    }
}

【讨论】:

  • 我看到了 Form.Load 事件,但没有看到 Form.Loaded 事件?
  • 对不起:我正在使用 WPF。如果 Windows 窗体没有加载事件,则必须使用显示窗体后触发的任何事件。你也必须在这个活动中做你的事情,至少如果你想在做你的事情时向用户展示一些东西......
【解决方案2】:

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

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

要修复它,请从 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
    }
}

【讨论】:

  • 不得不将其更改为 .Show() 而不是 .ShowDialog(),但这非常有效。谢谢!
  • 这行不通。由于使用了.ShowDialog(),因此只有在otherForm 关闭时才会调用otherForm.DoStuff();。你应该有 otherForm.Show(this); 让 .DoStuff() 执行。
猜你喜欢
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多