2013-01-19 53 views
2

我正在编写一个应用程序,它使用5个简单窗体的向导式系列。第一种形式NewProfile是从主应用程序MainForm的菜单项打开的,因此是MainForm的子窗体。第二种形式TwoProfile从NewProfile上的按钮打开。第三种形式ThreeProfile是从TwoProfile上的一个按钮打开的,以此类推为所有5种形式。这里是序列: MainForm - > NewProfile < - > TwoProfile < - > ThreeProfile < - > FourProfile < - > FiveProfile。我的问题是,当任何窗体(NewProfile,TwoProfile,ThreeProfile,FourProfile或FiveProfile)打开时,我不希望用户能够创建NewProfile的实例。一次只打开一个子窗体实例c#

我开始实施一个Singleton模式,其中途工作。如果NewProfile打开并且我转到MainForm并尝试创建NewProfile的另一个实例,它将起作用。如果NewProfile已被销毁,则它不起作用,前进到下一个表单并且TwoProfile,ThreeProfile,FourProfile或FiveProfile中的一个已打开。它告诉我NewProfile.IsDisposed是真实的,给我一个对Singleton实例的错误引用。

我无法弄清楚如何做我的逻辑,这样如果TwoProfile,ThreeProfile,FourProfile或FiveProfile中的一个打开,或者NewProfile本身打开,NewProfile将不会被创建。

我希望这是有道理的。我没有太多的代码可以发布,除了我为我的Singleton做的。

private static NewProfile _instance = null; 
    public static NewProfile Instance 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       _instance = new NewProfile(); 
      } 
      return _instance 
     } 
    } 

谢谢:)

+2

你为什么不直接使用含有用户控件,比你一个窗体只需更改Mainform中的用户控件,即可保证只打开“一个”表单并将所有用户控件存储在列表中,并且您可以下载或下载哪个UC按钮,以便加载哪个UC加载 – Venson

+1

您可以简单地隐藏()NewProfile而不是在你打开SecondProfi时销毁它乐? – Steve

+0

你看过做MDI ..吗? – MethodMan

回答

1

正如评论所说,每一个“形式”实际上可能是你换一个用户控件。这样,你只有一个表格和多个页面。或者,您可以隐藏表单。

如果你想要多个表单,那么你可以遍历所有打开的表单,看看你想检查的是否打开。如果没有,您可以打开NewProfile

bool shouldOpenNewDialog = true; 

foreach (Form f in Application.OpenForms) 
{  
    //give each dialog a Tag value of "opened" (or whatever name) 
    if (f.Tag.ToString() == "opened") 
     shouldOpenNewDialog = false;  
} 


if(shouldOpenNewDialog) 
    np = new NewProfile(); 

这是未经测试,但它应该通过所有打开的形式循环,并寻找任何具有Tagopened。如果碰到一个,那么它将shouldOpenNewDialog标志设置为false,并且不会调用NewProfile

+0

非常感谢您的及时回复!我在表格中付出了很多努力,所以我不想做一堆返工。结果工作是keyboardP的建议的变化。我在MainForm菜单项处理程序中执行了此操作: – user1791622

+1

哎呦,我打算去下一行...嘿嘿。如果(Application.OpenForms.Count> 1) { shouldOpenDialog = false; } if(shouldOpenDialog) { newProfile.Show(); } – user1791622

+0

随意张贴您的最终代码作为答案,然后在几天内接受它:) – keyboardP

1

我们处理这个问题的方式是拥有一个静态窗口管理器类,用于跟踪打开的窗体实例。当用户执行会导致打开新窗口的操作时,我们首先检查窗口管理器以查看表单是否已经打开。如果是这样,我们将重点放在它上面,而不是创建一个新的实例。

每个打开的窗体都继承自一个基本窗体实现,它在窗口管理器打开时自动向窗口管理器注册,并在关闭时删除其注册。

这里是的WindowManager类的一个大致的轮廓:

public class WindowManager 
{ 
    private static Dictionary<string, Form> m_cOpenForms = new Dictionary<string, Form>(); 

    public static Form GetOpenForm(string sKey) 
    { 
     if (m_cOpenForms.ContainsKey(sKey)) 
     { 
      return m_cOpenForms[sKey]; 
     } 
     else 
     { 
      return null; 
     } 
    } 
    public static void RegisterForm(Form oForm) 
    { 
     m_cOpenForms.Add(GetFormKey(oForm), oForm); 
     oForm.FormClosed += FormClosed; 
    } 

    private static void FormClosed(object sender, FormClosedEventArgs e) 
    { 
     Form oForm = (Form)sender; 
     oForm.FormClosed -= FormClosed; 
     m_cOpenForms.Remove(GetFormKey(oForm); 
    } 

    private static string GetFormKey(Form oForm) 
    { 
     return oForm.Name; 
    } 
} 

而且你可以按如下方式使用它:

 Form oForm = WindowManager.GetOpenForm("Form1"); 
     if (oForm != null) 
     { 
      oForm.Focus(); 
      oForm.BringToFront(); 
     } 
     else 
     { 
      oForm = new Form1(); 
      WindowManager.RegisterForm(oForm); 
      // Open the form, etc 
     }