繁体   English   中英

自动关闭ShowDialog框

[英]Self-closing ShowDialog box

我有两种形式,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的专家。

正如Markus所提到的,因为您的Form2构造函数调用this.Close() ,所以一旦Form2 otherForm = new Form2();行,就已经关闭了Form2窗口Form2 otherForm = new 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
    }
}

你必须打电话

//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();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM