[英]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.