Ahs*_*ain 0 .net c# visual-studio-2010 winforms
我正在开发一个项目,我正在创建一个实例并在我的程序中打开一个特定的表单,就像我使用下面的代码打开一个表单:
frm2 cs = new frm2();
cs.Show();
Run Code Online (Sandbox Code Playgroud)
但这里的问题是每次我点击按钮它只是打开一个新窗口,前一个也打开了,我想在这里做的是当我点击按钮,那个窗口已经打开然后它只是去了打开窗户,除了打开新窗户.希望你们理解我的问题,并帮助我做到这一点.
我试过这段代码:我在frm2.cs文件中写的代码是:
public partial class frm2 : Form
{
private static frm2 _form2 = null;
public frm2()
{
InitializeComponent();
}
public static frm2 Instance
{
get
{
if (_form2 == null)
{
_form2 = new frm2();
}
return _form2;
}
}
Run Code Online (Sandbox Code Playgroud)
并在frmMain.cs文件中我编码访问实例并打开项目是:
private void addProductToolStripMenuItem_Click(object sender, EventArgs e)
{
frm2.Instance.Show();
//frm2 cs = new frm2();
//cs.Show();
}
Run Code Online (Sandbox Code Playgroud)
它第一次工作正常,但当我打开frm2,关闭它然后再次尝试打开它编译器给出错误, frm2.Instance.Show(); 错误来了是
: Cannot access a disposed object.
Object name: 'frm2'.
Run Code Online (Sandbox Code Playgroud)
保存在全局类变量中打开的表单实例,然后,如果此变量不为null,则只调用Show而不是打开againg.但是应该遵循一些提示
public class Form1: Form
{
private frm2 _currentInstance = null;
....
if(_currentInstance != null)
{
_currentInstance = new frm2();
_currentInstance.FormClosed += instanceHasBeenClosed;
}
_currentInstance.Show();
....
private void instanceHasBeenClosed(object sender, FormClosedEventArgs e)
{
_currentInstance = null;
}
}
Run Code Online (Sandbox Code Playgroud)
订阅_currentInstance的FormClosed事件非常重要.这样,当用户关闭实例时,将通知您的Form1.并且您可以将内部变量重置为null,因此在随后的单击中您可以再次重新打开实例
还可以使用Application.OpenForms集合来检查您的表单是否显示
frm2 f = Application.OpenForms["NameOfForm2"];
if(f != null)
f.BringToFront();
else
{
frm2 f = new frm2();
f.Show();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10756 次 |
| 最近记录: |