2010-06-03 2 views
1

Я пытаюсь показать конкретную форму с помощью элемента управления treeview, узлы которого имеют значение tag, установленное для экземпляра формы, которую мне нужно показать. Код, который у меня есть в событии DoubleClick, отлично работает в первый раз, когда я показываю форму, но после этого получаю исключение объекта. Как вы можете видеть, я попытался обработать его, сбросив тег, но это не сработало. Есть ли способ показать форму более одного раза, не переходя в оператор switch в любое время, когда возникает исключение, и сброс тега в нужный тип формы? Мне хотелось бы, чтобы что-то приятнее выглядело так, как я показываю форму.Показать форму из TreeView в VB.NET

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() метод заканчивается

Это действительно зависит от того, что делают эти формы. Обычно я бы увидела, что ваш метод 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

Как бы вы могли искать экземпляр? –

+0

Добавленный пример: «myTag» - это текущее значение тега –

1

Форма удаляется, когда пользователь закрыт. Один из вариантов - обработать событие закрытия формы и просто скрыть ее, а не закрывать.