【问题标题】:Prevent Multiple Form Instances防止多个表单实例
【发布时间】:2011-01-11 13:24:32
【问题描述】:

如何防止打开多个表单?

我在表单上显示 .show 但用户可以再次单击主表单和按钮,然后打开另一个表单实例。

【问题讨论】:

    标签: winforms forms instance


    【解决方案1】:

    两个选项,取决于您的需要:

    1. 使用ShowDialog 代替Show,这将打开一个模式窗口。如果您不需要在子窗体打开时主窗体处于活动状态,这是显而易见的解决方案。

    2. 或者跟踪您已经在主窗体中打开的窗口,如果它已经打开,则不执行任何操作。如果您希望用户能够在子表单已打开的情况下使用主表单,则可能需要打开其他表单。

    【讨论】:

      【解决方案2】:

      做一些类似的事情:

      SingleForm myform = null;
      
      void ShowMyForm_Click(object sender, EventArgs e) 
      {     if (myform == null)
             {
                   myform = new SingleForm();  
              } 
             myform.Show();
             myform.BringToFront(); 
       }
      

      【讨论】:

      • 这样比较好,但不妨碍用户不小心或故意将主窗体再次拉到最前面。
      • 他没有说主窗体必须留在后台...他只是不希望用户在单击按钮时能够打开另一个窗体... ; ) 但是感谢编辑...哦...我猜我误读了。我在想当单击按钮时打开了第二种形式...idk
      • 我打算添加 .ShowDialog() 作为另一个选项,但 John K. & Johannes 击败了我
      【解决方案3】:

      强制你的表单对象遵守单例模式

      【讨论】:

        【解决方案4】:

        我更喜欢使用泛型和延迟加载来处理我的表单。由于我的所有表单都继承自一个基类,因此我可以使用相同的方法将表单带到前面、将它们发送到后面、销毁它们、启动它们等等。

        如果您保留一个负责管理任何已加载表单的表单管理器类,您可以将任何您想要的表单放在最前面,或者阻止特定表单返回,除非满足某些条件。

        public void LoadForm<T>() where T : MyNameSpace.MyBaseForm 
        {
            // Load all your code in this joint and just call it when you
            // need a form. In here, you can determine if a copy of the form
            // already exists and then bring it forward or not
        } 
        

        【讨论】:

          【解决方案5】:

          禁用主窗体直到子窗体消失,或禁用按钮。

          button_onClick(object Sender, EventArgs e)
          {
             Button   btn = sender as Button;
             btn.Enabled = false;
             Form myform = new MyForm();
             myform.Show();
          }
          

          当然,如果你想要模态行为,你真的应该使用form.ShowDialog() 而不是form.Show()

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-29
            • 2015-04-22
            • 1970-01-01
            • 1970-01-01
            • 2013-02-07
            • 1970-01-01
            相关资源
            最近更新 更多