2010-06-03 42 views
1

我试图用treeview控件显示一个特定的窗体,其中的节点将它们的tag值设置为我需要显示的窗体的一个实例。我在DoubleClick事件中使用的代码在我第一次展示表单时效果很好,但在此之后,我得到了一个处理异常的对象。正如你所看到的,我试着通过重置标签来处理它,但那并不奏效。有没有什么方法可以在任何时候出现异常并且将标签重置为正确的表单类型时不经过switch语句而多次显示表单?我希望更好的看起来像我展示表单的方式。在VB.NET中从TreeView中显示表格

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 

回答

1

这里的问题是如果用户关闭表单,对象将被处置。

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

  1. 在这个时候添加FormX_Closed()的处理程序,你可以重新设置标签参考
  2. 你可以切换到“查看对话”的过程,然后您的DoubleClick前reset()方法结束

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

查找例

的要求,在评论,如果我是这样做不同的方式,我会用一个枚举值,或标签,甚至一个简单的整数“键”值。然后我会创建如下所示的内容来展示它。

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

基本上集中并启动按需的形式,你可以,如果你想要更多的控制权或者有很多不同形式类型的切换这一点对于其他的设计模式。

+0

你将如何做查找来创建实例? – 2010-06-03 19:07:25

+0

新增示例,“myTag”是您当前的标签值 – 2010-06-03 19:14:27

1

表单在用户关闭时处理。一种选择是处理表单的关闭事件,并将其隐藏而不是关闭。