2009-09-05 47 views
0

我是编程新手,在理解对象生存期/实例化方面遇到困难。对象/设计模式的多个实例的生存期帮助

我有一个从datagridview和面板的窗口。

datagridview有一个复选框列和从数据库填充的名称列表。

该面板有几个文本框(例如姓名,年龄,最喜爱的运动队)和一个“保存更改”按钮。

这个想法是,当用户通过选中适当的复选框在datagridview中选择一个人时,面板通过从数据库中提取数据来显示该人(姓名,年龄,fav sports团队)的相关数据。如果用户希望更新个人的详细信息,可以通过输入文本框然后单击“保存更改”按钮来完成。迄今为止非常简单。

我设计这个的方法是有一个'面板'类,并在用户选中复选框时创建一个实例。 (注意 - 我创建'panel'类的原因是我打算复制datagridview和panel在我的表单中的其他tabpages上,并认为有一个通用的'panel'类可以重用。)

我的代码看起来有点像这样:

If CheckBoxClicked Then 
Dim UpdatePanel As New UpdatePanel(MyForm.NameTextBox, MyForm.AgeTextBox, MyForm.FavSportTeamTextBox, MyForm.SaveButton) 
UpdatePanel.GetData() 
... 

当用户点击SaveButton数据更新到数据库和我有说“更新成功”的显示消息(简单的文本框)并在隐藏自身之前显示5秒钟。

这里的问题是:

假设用户检查一个复选框,检查数据,并没有做任何改动,然后检查其他复选框,并决定通过点击“保存更改”按钮更新数据。会发生什么情况是“更新成功”消息显示两次。

我认为这是因为每当用户选中一个复选框时,就会创建一个UpdatePanel实例。如果我使用复选框选择五个不同的人,然后点击“保存更改”,我会得到五个“更新成功”消息。

我不知道如何克服这一点。感觉每次单击一个复选框时,我需要检查UpdatePanel的一个实例是否存在,然后将其销毁。我尝试使用UpdatePanel = Nothing,并且调查了IDisposable和GC.Collect(),但没有运气。

我的问题是:

  1. 我怎样才能确保只创建一个 面板的实例?
  2. 如果我创建的 具有相同名称 同一个对象的多个实例?他们都坐在内存或不 “计算机”只保留一个 参考最近 产生的? (是否没有名称 冲突?)
  3. 我是不是走错了 错误的轨道与我的设计模式 和使用'面板'类?

感谢

回答

0

确保你正在检查是否有任何更改或不更新数据库之前。可能任何时候用户检查一个数据,你都会增加一个更新。如果你发布更多的代码会更容易回答,因为你的解释并不十分清楚,并且很难说没有看到大部分的代码。

  1. 使用你如何创建它们的singleton模式

  2. 这要看情况。在方法范围中创建的对象被标记为删除,并等待GC收集他。如果你的对象存储在你的WinForm的某个变量中,它将阻止它们与GC一起工作。因此,默认情况下,对象正在死亡,但您可以延长它的寿命。还要注意GC时间不确定,你永远不知道GC什么时候会做它的工作和销毁对象。

  3. s not clear what was done, so if you post the code I将能够回答这个问题。