如何防止我的程序打开同一个窗口表格两次

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)

Ste*_*eve 7

保存在全局类变量中打开的表单实例,然后,如果此变量不为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)

  • 你可能想要"BringToFront"而不是"Show" (2认同)