2010-06-03 90 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

表單在用戶關閉時處理。一種選擇是處理表單的關閉事件,並將其隱藏而不是關閉。