您应该如何重新加载表单并重新初始化?

时间:2015-07-12 04:08:29

标签: vb.net winforms visual-studio-2013

较旧的应用程序使用隐式实例加载某些表单:

find $PWD -type f  -name $filename 2>/dev/null | wc -l 

在VS2008 32位和VS2013 64位之间的某个时间,表单在重新加载时停止初始化。例如,如果您加载表单,关闭表单(使用Close方法),然后再次加载表单,类和控件(以及我假设,表单)不会初始化为新实例。

重新初始化可以通过将form2.showdialog() 放在FormClosed事件中,或者使用表单的显式实例来完成:

me.dispose()

是否有充分的理由使用这些方法之一,或者是否有另一种方法应该用于在重新加载时初始化表单?

3 个答案:

答案 0 :(得分:2)

如果使用Show方法显示表单,将自动调用Dispose。如果使用ShowDialog等其他方法(您的情况是这样),或者表单根本不显示,则必须在应用程序中调用Dispose。您还可以通过将dispose从设计器文件移动到代码文件中来处理dispose,并处理它们。

另一方面,Using语句通常使您的应用程序更易于维护,并且不易出现与资源生命周期相关的死锁和其他不当行为。我会坚持使用这种方法。

此外,您无法将Me.Dispose放入Form Closed事件(可能的问题)。如果您使用ShowDialog它将会失败,因为它会首先处理您的对象,如果您需要它们,它们就会消失。

以下是有关处置的更多内容:https://msdn.microsoft.com/en-us/library/aw58wzka(v=vs.110).aspx

答案 1 :(得分:1)

非常明确的解释from MSDN

  

与非模态表单不同,.NET不会调用Close方法   用户单击对话框的关闭表单按钮时的框架   或设置DialogResult属性的值。相反,形式是   隐藏,可以再次显示而无需创建新的实例   对话框。因为隐藏了显示为对话框的表单   关闭,你必须在表单时调用表单的Dispose方法   您的应用程序不再需要

ShowDialog()被调用并关闭时,表单的实例将保留在内存中,并且可以再次使用,例如从某些公共属性获取结果。 如果您不再使用此表单,则需要调用Dispose方法来处理表单和表单的控件

Dim myform As New MyDialogForm()
myform.ShowDialog()
Dim result As Object = myForm.SelectedResult()
myform.Dispose() 'need to call manually, if instance not used anymore

当您使用Using关键字时,Dispose块的结尾会自动执行Using方法

Dim result As Object
Using myform As New MyDialogForm()
    myform.ShowDialog()
    result = myForm.SelectedResult()
End Using 'myform.Dispose will be called

底线:两种方法做同样的事情。
             但是Using阻止会自动调用Dispose方法

P.S。将Me.Dispose放入FormClosed事件处理程序然后再   - 形式的实例将留在记忆中,即使形式被关闭
  - 并且只有在您再次尝试使用已处理的控件之后才能使用。如果您尝试显示处置对象,则会抛出ObjectDisposedException

如果您不再使用表单,则Using阻止将是最佳方法

答案 2 :(得分:1)

使用ShowDialog()显示表单时,Form对象及其子控件会自动处理。这听起来很古怪,但这是为了非常的理由。 ShowDialog返回DialogResult.OK后,您通常会获得对话框结果。没人会喜欢因为ObjectDisposedException而失败。由于对话结果通常存储在控件中,因此可能会发生这种情况。

您应始终使用Using语句来确保处理表单对象及其所有控件。

可能的角落情况是故意不处理它,因为您喜欢重新显示具有原始输入值的对话框。但这并非完全错误,但它仍然是保存这些值的非常昂贵的方法。那些未曝光的窗口对象在系统资源中花费了一条腿和一条腿。