即時通訊新的.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
你正在調用'InitializeComponent'兩次 – Alberto
是的修復它。謝謝 –
我可能不是主題,但在我看來,表單永遠不應該*實現單例模式!如果你無法正確地將數據傳入和傳出表單,這是一個不同的問題,但是從你發佈的代碼來看,我根本沒有看到創建單例的一點理由。 –