2009-08-10 52 views
1

我正在编写一个程序,使用2种形式,即主要形式和配置形式,因此当用户单击工具栏菜单 - >首选项时,将显示首选项表单并且我希望它用户一次只能有一个首选项形式。使用表格

当我使用:

Prefs preferencias = new Prefs; 

    private void preferenciasToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     preferencias.Show(); 
    } 

它的工作原理,但是当我关闭首形式,并尝试打开一个新的程序崩溃。

,当我使用:

private void preferenciasToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     Prefs preferencias = new Prefs; 
     preferencias.Show(); 
    } 

用户可以甲肝多首形式。

我该怎么办?

在此先感谢。

回答

5

这听起来像你想有一个模态对话框,所以你需要使用的ShowDialog()方法,而不是显示():

private void preferenciasToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    preferencias.ShowDialog(); 
} 
1
preferencias.ShowDialog() 

将只允许一个偏好窗口打开。

0

您可以在菜单项的点击事件中使用Application.OpenForms属性检查该类型的表单是否已经打开。如果没有该类型的表单打开,则可以打开您的实例。如果有,它就不会显示。

foreach (Form form in Application.OpenForms) { 
    if (form.GetType() != typeof(PreferencesForm)) { 
     new PreferencesForm().Show(); 
    } 
} 

或者如前所述,你可以调用PreferencesForm.ShowDialog()使窗体模式,在这种情况下,用户必须关闭窗体之前,他们甚至可以与主要形式再次进行互动。

,如果你希望用户能够使用,即使喜好形式是开放的主要形式您使用的方法取决于。

+0

这似乎有点落后,但它会工作,如果你不想Preferences对话框是模态(这似乎像明显的选择,虽然) – 2009-08-10 18:31:29

+0

更新我的职务与第一种方法背后的原因。 – 2009-08-10 18:32:40

0

如果您正在寻找且只有1个,你可能想实现Singleton pattern的偏好设置类。

+0

我认为当OP只需要一个模态对话框时就会过度。 – 2009-08-10 18:36:02

2

其他人建议的ShowDialog()是一个很好的答案。如果你有兴趣的替代,这里的东西我有时候做:

private void FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (e.CloseReason == CloseReason.UserClosing) 
    { 
     e.Cancel = true; 
     Hide(); 
    } 
} 

这样做是只是隐藏的形式,这样,如果你再次显示它,它已经加载到内存中。另外,如果你有一个计时器或其他线程在运行,它仍然可以运行并完成它的工作。