2010-02-01 60 views
6

如何防止打开多个表单?防止多个表单实例

我在窗体上显示,但用户可以再次单击主窗体和按钮,打开窗体的另一个实例。

回答

2

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

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

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

0

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

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

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

2

做这样的事情:

SingleForm myform = null; 

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

这样比较好,但它并不能防止用户意外或故意将主窗体再次带到最前面。 – 2010-02-01 01:11:01

+0

他没有说主表单必须留在后台......他只是不希望用户能够打开另一个表单,当按钮被点击时......;)但是thx的编辑。 .. 哦......我误解了我的猜测。我以为有一个按钮被点击时打开了第二个窗体... idk – IAbstract 2010-02-01 01:26:24

+0

我打算添加.ShowDialog()作为另一个选项,但John K.&Johannes打败了我 – IAbstract 2010-02-01 01:27:39

1

力表单对象坚持Singleton模式

0

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

如果您保留一个表单管理器类负责管理任何已加载的表单,您可以将任何形式带到您想要的前端,或防止特定表单能够返回,除非满足某些标准。

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 
}