我是.net的新手,这也是我在这里的第一篇文章,所以我可以提前为我可能正在做的任何新错误道歉:)
问题的背景。 我正在开发一个C#项目,作为其中的一部分,我必须将windows表单数据存储到数据库中。我正在使用数据类“人”将Windows表单数据传输到负责代表Windows窗体访问数据库的类。我希望在Windows窗体代码上使用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
答案 0 :(得分:0)
您正在拨打InitializeComponent
两次。
试试这个:
private static CreateAdmin _instance;
public static CreateAdmin Instance
{
get { return _instance ?? (_instance = new CreateAdmin()); }
}
答案 1 :(得分:0)
在我的观点中,filoe的解决方案是最干净的,但是还有可能在C#中引入(有效的)单例:
public static readonly CreateAdmin Instance = new CreateAdmin();
客户代码:
CreateAdmin.Instance.DoSomething()
但正如已经提到的,我推荐了菲尔的方式!