2013-12-12 45 views
0

我有以下代碼爲菜單單擊上的窗體類型創建對象。限制CreateInstance方法創建對象在C#.net窗口應用程序中同時創建兩次

private void CreateForm<T>(string FormName, FormStartPosition FSP, FormWindowState FWS) where T : Form 
    { 
     try 
     { 
      var NewInstance = (T)Activator.CreateInstance(typeof(T), FormName); 
      ((T)NewInstance).StartPosition = FSP; 
      ((T)NewInstance).WindowState = FWS; 
      ((T)NewInstance).MdiParent = this; 
      ((T)NewInstance).Show(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message.ToString()); 
      MainFunctionality.ErrorRecorder(ex); 
     } 
    } 

這是代碼是在MdiParent窗體和工作正常。但是,我想要的是,如果我再次單擊相同的菜單,則不應該爲同一表格類型第二次創建表單(例如:Item_Master不應該同時創建兩次並顯示)

如何可以我做到了這一點?在此先感謝.......

回答

0

爲了更好地實現你想要的東西,有很多方法的simpest之一是創建一個實例解釋這樣的:

private Dictionary<string, Form> InstanceDictionary{get;set;} 
private readonly object obj = new object(); 

,然後在你的函數你測試窗口是否已經存在:

private void CreateForm<T>(string FormName, FormStartPosition FSP, FormWindowState FWS) where T : Form 
{ 
    lock(obj) 
    { 
    if(InstanceDictionary.ContainsKey(FormName)) 
     InstanceDictionary[FormName].Show(); 
    try 
    { 
     var NewInstance = (T)Activator.CreateInstance(typeof(T), FormName); 
     InstanceDictionary.Add(FormName); 
     ((T)NewInstance).StartPosition = FSP; 
     ((T)NewInstance).WindowState = FWS; 
     ((T)NewInstance).MdiParent = this; 
     ((T)NewInstance).Show(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message.ToString()); 
     MainFunctionality.ErrorRecorder(ex); 
    } 
    } 
} 

然後你必須在窗體關閉時從字典中移除窗體。

我希望這可以幫助你開始。

+0

我會檢查它並明天讓你知道... – jeevacl

+0

我只是因爲「對象實例未設置爲對象的實例」而出現錯誤。在那個InstanceDictionary屬性... – jeevacl

+0

你應該instanciate它在你的構造函數或一些其他適當的地方,你應該在你的構造函數中添加此行InstanceDictionary = new Dictionary () – Swift