【问题标题】:VB.NET Form in class is not destroyed when class is destroyed销毁类时,类中的VB.NET窗体不会被销毁
【发布时间】:2014-04-19 20:27:06
【问题描述】:

我已经创建了一个应用程序。

主窗体是“Form1”。

我在 Form1 中声明了一个类,如下所示:

Public Class Form1

    Private _MyClass As Class1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        _MyClass = New Class1

    End Sub
End Class

Class1 声明如下:

Public Class Class1

    Private f As Form2

    Public Sub New()

        f = New Form2
        f.Show()

    End Sub
End Class

当我在主窗体上单击 Button1 时,会创建 _MyClass1 并显示 Form2。

现在当我第二次单击 Button1 时,我希望 _MyClass1 被销毁并创建一个新的 _MyClass1。

我预计第一个 Form2 会消失,因为 _MyClass1 已被破坏。

我认为它只存在于_MyClass1中,由于_MyClass1被销毁,Form2也应该被卸载。

相反,我突然打开了两个 Form2 窗口。

我的想法哪里出错了?

来自 VB6,我希望如果它的宿主类被终止,它会自动卸载一个表单。在 VB.NET 中不也是这样吗?

【问题讨论】:

    标签: vb.net forms class


    【解决方案1】:

    你可以使用:

    Public Class Form1
    
        Private _MyClass As Class1
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
             If Not _MyClass Is Nothing Then ' To check if Class is initialized, If so then Close the Class or form
            _MyClass.close()
             End If
            _MyClass = New Class1
    
        End Sub
    End Class
    
    Public Class Class1
    
            Private f As Form2
    
            Public Sub New()
    
                f = New Form2
                f.Text = "form2"
                f.Show()
    
            End Sub
            Public Sub close()
                f.Close()
                Me.Finalize() ' Call Destructor 
            End Sub
        End Class
    

    【讨论】:

    • 现在每次单击按钮时都会关闭上一个按钮,将其处理掉并在按钮单击时创建 Class1 的新实例。
    【解决方案2】:

    您在表单内的私有类中有一个私有表单。 IDisposable 恰好适用于创建其他一次性对象的类(表单是类)(CA 会告诉您,当您的代码创建的东西无法像您的 3 个俄罗斯套娃一样正确处理):

    Public Class Class1
    Implements IDisposable
    
    Private f As Form2
    
    Public Sub New()
        f = New Form2
        f.Text = "form2"
        f.Show()
    End Sub
    
    Private disposedValue As Boolean ' To detect redundant calls
    
    ' IDisposable
    Protected Overridable Sub Dispose(disposing As Boolean)
        If Not Me.disposedValue Then
            If disposing Then
                If f IsNot Nothing Then
                    f.Close()           ' or f.Dispose
                End If 
            End If
        End If
        Me.disposedValue = True
    End Sub
    
    ' VS generated code
    Public Sub Dispose() Implements IDisposable.Dispose
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub
    
    End Class
    

    对 Form1.Designer.vb 进行一次调整(CA 会告诉你):

    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        Try
            If disposing AndAlso components IsNot Nothing Then
                components.Dispose()
                _MyClass.Dispose()             '  dispose of your toys
            End If
        Finally
            MyBase.Dispose(disposing)
        End Try
    End Sub
    

    按钮点击:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
        ' depending on what the point is, this will work:
        If _MyClass Is Nothing Then 
            _MyClass = New Class1
        End If
    
       ' if you really need it start anew:
       ' If _MyClass IsNot Nothing Then 
       '      _MyClass.Dispose
       ' End If 
       ' _MyClass = New Class1
    
    
    End Sub
    

    【讨论】:

      【解决方案3】:

      当您再次单击按钮时。它不会破坏类的先前对象。
      每次单击按钮时,都会为 class1 创建一个新的实例或对象。

      【讨论】:

      • 那么之前的 _MyClass 对象会发生什么?
      • 对它的引用丢失了,它会被垃圾收集器清理掉
      • 我该怎么做才能终止/卸载 Form2?我看到 Class1.Finalize 仅在我退出应用程序时被调用,即使我说 _MyClass = Nothing。或者我应该改变我的应用程序设计,因为我的方法很脏?
      • @attila 引用不会在 form2 的情况下丢失,因为它不会在创建 Class1 的新实例时被释放。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多