我想在一个窗口FROM1调用另一个FROM2,为了让FROM2只生成一个,所以我使用了单例模式。在FROM2中有一个取消的BUTTON。
当然,FROM2会自动在右上角有一个关闭的(小叉叉)。现在我在取消的按钮上设定了事件:
this.setVisible=false;如果是this.Dispose()。则会出异常,异常为:第2次再在FROM1当中调用FROM2的时候就找不到FROM2的实例。点了FROM2的关闭也是一样。请高手指教。代码在家里机器上。如有需要再贴代码。谢谢!
当然,FROM2会自动在右上角有一个关闭的(小叉叉)。现在我在取消的按钮上设定了事件:
this.setVisible=false;如果是this.Dispose()。则会出异常,异常为:第2次再在FROM1当中调用FROM2的时候就找不到FROM2的实例。点了FROM2的关闭也是一样。请高手指教。代码在家里机器上。如有需要再贴代码。谢谢!
解决方案 »
- 关于C#做游戏的一个效率问题
- 「玩一玩」进化计算方法(C#版)「安德鲁·基里洛夫 著,野比 译」
- 谁有Interop.word.dll文件??
- httpwebresponse的问题,请达人帮忙,谢谢。
- listView里面的信息如何保存到文件?
- C#写OPCClient
- 我是一初学者,不知道从哪入手?请各位大侠分享点经验!感激不尽!
- 倾全囊之分710征咒3721变态狂(二)
- VPF中用宏代换只要5行代码就能实现的功能在C#中要几百行代码???各位有什么好的招?
- 急急急,请帮忙啊,有关于 comboBox control 的问题?
- 想自己做一个开销软件 高手进来帮帮忙
- Httpwebrequest抓取网页发生错误〔winfrom〕
2.响应Closing事件 取消closing并且设为Invisiable
private void llblId_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{ if (RegisterForm.getInstance() != null)
{
RegisterForm registerForm = RegisterForm.getInstance();
registerForm.Show();
registerForm.Select();
}
else
{
MessageBox.Show("系统忙,请稍候再试!");
}这是from2的构造方法代码:
public partial class RegisterForm : Form
{ private static RegisterForm registerForm_instance = null;
//返回类对象的唯一实例,以使注册的窗口只产生一个
public static RegisterForm getInstance()
{
if (registerForm_instance == null)
{
registerForm_instance = new RegisterForm(); //!!出异常的地方
}
return registerForm_instance; } private RegisterForm()
{
InitializeComponent();
}
这样之后,在from1中点button的时候没有问题,达到了只实例化一个from2的目的。但是当我在from2中点这个窗体的叉叉
之后from2被关闭。再去from1中点击button的时候,就会出异常(位置见代码注释)。请高手指教。
按你的方法,在Form2中
private void RegisterForm_FormClosing(object sender, FormClosingEventArgs e)
{
registerForm_instance = null;
}方法二:
在Form1中
RegisterForm f2 = null;
private void button3_Click(object sender, EventArgs e)
{
if (f2 == null || f2.IsDisposed)
{
f2 = new RegisterForm();
f2.Show();
}
else
{
f2.Activate();
}
}
在Form2中不用添加任何额外的代码
异常V************** 异常文本 **************
System.ObjectDisposedException: 无法访问已释放的对象。
对象名:“RegisterForm”。-------------------------------
RegisterForm register = null;
private void llblId_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
if(register ==null || register.IsDisposed)
{
register = RegisterForm.getInstance();
register.Show();
register.Select();
}
else
{
register.Activate();
}
RegisterForm register = null;
private void button3_Click(object sender, EventArgs e)
{
if (register == null || register .IsDisposed)
{
register = new RegisterForm();
register .Show();
}
else
{
register .Activate();
}
}这种方法,就不用RegisterForm.getInstance();了
在Form1中写上面的代码,在Form2中,把下面的代码删除
private static RegisterForm registerForm_instance = null;
//返回类对象的唯一实例,以使注册的窗口只产生一个
public static RegisterForm getInstance()
{
if (registerForm_instance == null)
{
registerForm_instance = new RegisterForm(); //!!出异常的地方
}
return registerForm_instance; }
请问3楼Macosx(咋就不结贴呢) ()发表于:2007-11-26 12:25:063楼 得分:0
1.调用Dispose当然就找不到实例了 必须再生成实例才行 必须使用Visiable属性
2.响应Closing事件 取消closing并且设为Invisiable
第2条如何实现?我是菜鸟,请指点指点,谢谢!
刚想试试单例模式就照搬过来了,为什么7楼的方法可以,而我的方法不行呢?奇怪.
不过非常感谢root(千年)!
改成 registerForm.ShowDialog(); 就可以了
阿丹
等 级:
发表于:2007-11-26 16:33:2611楼 得分:0
Closing事件参数e里有个Cancel属性,设为true就是取消Closing了。
改成 registerForm.ShowDialog(); 就可以了