Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自动关闭显示对话框_C#_Winforms - Fatal编程技术网

C# 自动关闭显示对话框

C# 自动关闭显示对话框,c#,winforms,C#,Winforms,我有两张表格,表格一和表格二。当程序运行时,Form1是启动的表单。然后我想调用Form2,在Form1前面显示它,在Form2中做一些事情,然后自动关闭Form2而不需要任何输入,这样用户就可以继续使用Form1 我尝试了以下方法: public partial class Form1 : Form { public Form1() { InitializeComponent(); Form2 otherForm = new 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,消息为“无法访问已处置对象”。我尝试搜索internet,但没有找到任何内容。我尝试过使用这个.Dispose(),以及使用.Show()代替.ShowDialog()。我试图以这种方式实现的目标可能吗

我曾考虑将Form2制作成自己的.exe并调用.exe作为替代,但我想在重写所有内容之前,我会询问StackOverflow的专家。

您必须调用

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

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

close()
方法除了关闭窗口(以及所有拥有的窗口)外,还释放资源。因此,在下一行中,当
otherForm.ShowDialog()时时,它无法访问
其他表单
(已被释放)并抛出
ObjectDisposedException
。这解释了您遇到异常的原因

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

例如:

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
    }
}

你到底想在Form2上做什么?在构造函数中关闭它似乎适得其反。在form2构造函数末尾关闭它的
是什么?把它拿出来。ShowDialog关闭的表单you@orhtej2Form2是一个窗口,它将检查更新并给出其所在位置的实时状态。我有一个禁用的多行文本框,我正在其中显示多行文本。我想检查更新,如果有更新,请下载更新,然后关闭“检查更新”窗口。@pm100 ShowDialog需要用户输入才能关闭。我不希望用户必须手动关闭窗口。我想在检查完更新后自己关闭它。我看到一个Form.Load事件,但没有看到Form.Loaded事件?抱歉:我正在使用WPF。如果Windows窗体没有加载的事件,则必须使用显示窗体后激发的任何事件。在这种情况下,你也必须做你的事情,至少如果你想在做你的事情的时候向用户展示一些东西……你必须将它改为.show()而不是.ShowDialog(),但这非常有效。谢谢这行不通。由于使用了
.ShowDialog()
otherForm.DoStuff()otherForm
时才会调用code>。你应该有
otherForm.Show(这个)使.DoStuff()执行。