C# 自动关闭显示对话框
我有两张表格,表格一和表格二。当程序运行时,Form1是启动的表单。然后我想调用Form2,在Form1前面显示它,在Form2中做一些事情,然后自动关闭Form2而不需要任何输入,这样用户就可以继续使用Form1 我尝试了以下方法:C# 自动关闭显示对话框,c#,winforms,C#,Winforms,我有两张表格,表格一和表格二。当程序运行时,Form1是启动的表单。然后我想调用Form2,在Form1前面显示它,在Form2中做一些事情,然后自动关闭Form2而不需要任何输入,这样用户就可以继续使用Form1 我尝试了以下方法: public partial class Form1 : Form { public Form1() { InitializeComponent(); Form2 otherForm = new Form2();
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()时调用code>时,它无法访问其他表单
(已被释放)并抛出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()执行。