我有一个表单,我通过按钮点击显示。当我第二次点击按钮时,我再次收到一个表格。所以我想要阻止它,也就是说,我想一次只显示一个表单的实例。我试过使用singleton:
public partial class MyForm : Form
{
private static Object _mutex = new Object();
private static MyForm _instance = null;
public static MyForm GetInstance(...params...)
{
if (_instance == null)
{
lock (_mutex)
{
if (_instance == null)
{
_instance = new MyForm(..params..);
}
}
}
return _instance;
}
}
并称之为:
private MyForm Form {set;get;}
private void MyButtonClick(object sender, EventArgs e)
{
Form = MyForm.GetInstance(...params...);
if (!Form.Visible)
Form.Show();
}
点击按钮后,我会收到一张表格。关闭它并再次单击该按钮后,在结果中出现错误:
System.ObjectDisposedException:无法访问已处置的对象。
对象名称:'MyForm'。
我做错了什么?也许我不需要单身,还有其他办法吗?
答案 0 :(得分:3)
关闭的表单已被处理,无法重新显示。实例变量必须重置为null,否则表单必须阻止自己关闭并隐藏自己。
e.g。
protected override void OnFormClosed(FormClosedEventArgs e)
{
_instance = null;
base.OnFormClosed(e);
}
答案 1 :(得分:1)
设置一个控制表单是否打开的变量不是更容易吗? 我一直这样做,每当我想在一个窗体中的多个窗口上做它时,我就用它做一个数组,例如:
if(!isOpen[0]) {
isOpen[0]=true;
Form.Show;
}
为此,您可以通过其他表单访问isOpen,然后当您关闭相关表单时,使用Closing
事件将变量从那里设置为false。
答案 2 :(得分:0)
使用Ispostback
方法..
public partial class MyForm : Form
{
private static Object _mutex = new Object();
private static MyForm _instance = null;
public static MyForm GetInstance(...params...)
{
if (_instance == null)
{
lock (_mutex)
{
if (Ispostback)
{
_instance = new MyForm(..params..);
}
}
}
return _instance;
}
}