1

我正在尝试使用树视图控件显示特定表单,其节点的tag值设置为我需要显示的表单的实例。我在 DoubleClick 事件中的代码在我第一次显示表单时效果很好,但在那之后我得到了一个对象处理异常。如您所见,我尝试通过重置标签来处理它,但这不起作用。有什么方法可以在出现异常并将标签重置为正确类型的表单时多次显示表单而无需通过 switch 语句?我想要一些更好看的东西,就像我展示表格的方式一样。

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim fm2 As New Form2()
        Dim fm3 As New Form3()
        TreeView1.Nodes(0).Tag = fm2
        TreeView1.Nodes(1).Tag = fm3
    End Sub

    Private Sub TreeView1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles TreeView1.DoubleClick
        Try
            CType(TreeView1.SelectedNode.Tag, Form).Show()
        Catch odex As ObjectDisposedException
            TreeView1.SelectedNode.Tag = New Form()
            TreeView1_DoubleClick(sender, e)
        Catch nrex As NullReferenceException
            'No node selected, do nothing.  
        End Try
    End Sub
End Class
4

2 回答 2

1

当用户关闭表单时,表单会被释放。一种选择是处理表单的 Closing 事件,然后将其隐藏而不是关闭。

于 2010-06-03T19:05:04.697 回答
1

您的问题是如果用户关闭表单,则该对象将被释放。

有几种方法可以处理这个问题,其中一些比另一种更优雅。

  1. 这个时候给FormX_Closed()添加一个handler就可以重置标签引用了
  2. 您可以切换到“显示对话框”过程,然后在 DoubleClick() 方法结束之前重置

这真的取决于这些表格在做什么。通常,我会看到您的 DoubleClick 方法进行查找然后创建实例,这仅仅是因为如果您创建实例,您正在使用可能不需要的内存,但考虑到您的应用程序,这可能是必要的。

查找示例

根据评论中的要求,如果我要以不同的方式执行此操作,我将使用枚举值,甚至是标签的简单整数“键”值。然后我会创建类似下面的东西来展示它。

Select Case myTag
    Case 1
        Dim formInstance As New Form1()
        formInstance.Show()
    Case Else
        Dim formInstance As New Form2()
        formInstance.Show()
End Select

基本上集中它并按需启动表单,如果您想要更多控制或有很多不同的表单类型,您可以将其切换为另一种设计模式。

于 2010-06-03T19:05:23.817 回答