2013-12-10 12 views
2

即時通訊新的.net,這也是我的第一個職位,所以提前道歉,我可能會做任何newb錯誤:)爲什麼我的C#單例不工作?

問題的背景。 我正在處理一個C#項目,並將其作爲其中的一部分,我必須將Windows窗體數據存儲到數據庫中。我使用數據類「person」將窗體數據傳輸到負責在窗體窗體上訪問數據庫的類。我希望在窗體窗體代碼中使用Singleton模式來防止存在多個窗口實例。

問題 在保存按鈕事件處理代碼,我想創建一個「人」的對象,與用戶輸入的值填充它,然後將其發送至被保存到數據庫中。問題發生在這裏。 「Person」對象沒有被填充! 我已經嘗試過在另一個表單中這樣做,我沒有修改代碼以適應單例模式,並且工作正常。

那麼我在這裏做錯了什麼?有沒有辦法讓我繼續保持單身模式並使其工作?

窗口表單代碼

namespace AgTrain 
{ 
    public partial class CreateAdmin : Form 
    { 
     private static CreateAdmin instance; 

     private CreateAdmin() 
     { 
      InitializeComponent(); 
     } 

     private void CreateAdmin_Load(object sender, EventArgs e) 
     { 

     } 

     public static CreateAdmin getInstance() 
     { 
      if(instance==null) 
      { 
       instance = new CreateAdmin(); 
       instance.InitializeComponent(); 
      } 
      return instance; 
     } 

     public void makeInstanceNull() 
     { 
      instance = null; 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Person personToBeSaved = new Person(); 
      PersonDAO personDAO = new PersonDAO(); 


      personToBeSaved.FirstName = textBox1.Text; 
      personToBeSaved.LastName = textBox2.Text; 
      personToBeSaved.Address = textBox3.Text; 
      personToBeSaved.TelNo = textBox4.Text; 
      personToBeSaved.UserName = textBox5.Text; 
      personToBeSaved.Password = textBox6.Text; 
      personToBeSaved.UserType = "admin"; 

      personDAO.addPerson(personToBeSaved);   
     } 

    } 
} 

來電代碼

private void createAdminToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     CreateAdmin creAdmin = CreateAdmin.getInstance(); 
     creAdmin.Closed += (s, ex) => { creAdmin.makeInstanceNull(); }; 
     creAdmin.MdiParent=this; 
     creAdmin.Show(); 
    } 

感謝。 Dumidu

+3

你正在調用'InitializeComponent'兩次 – Alberto

+0

是的修復它。謝謝 –

+1

我可能不是主題,但在我看來,表單永遠不應該*實現單例模式!如果你無法正確地將數據傳入和傳出表單,這是一個不同的問題,但是從你發佈的代碼來看,我根本沒有看到創建單例的一點理由。 –

回答

0

您打給InitializeComponent兩次。 試一下:

private static CreateAdmin _instance; 
public static CreateAdmin Instance 
{ 
    get { return _instance ?? (_instance = new CreateAdmin()); } 
} 
+0

仍然使用屬性。謝謝:) –

0

在我opionion是thefiloe的解決方案最乾淨的,但有一種可能性,介紹在C#(有效)單身:

public static readonly CreateAdmin Instance = new CreateAdmin(); 

客戶端代碼:

CreateAdmin.Instance.DoSomething() 

但如前所述,我建議thefiloe的方式!

+0

但是,你可以使用這種模式來創建窗體?這是否有必要在UI線程上發生? – CodesInChaos

+0

糟糕,我忽略了目標類是一種形式。 @CodesInChaos:你是對的! – Basti