Показать форму из TreeView в VB.NET - PullRequest
1 голос
/ 03 июня 2010

Я пытаюсь показать конкретную форму, используя элемент управления в виде дерева, узлы которого имеют значение 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

Ответы [ 2 ]

1 голос
/ 03 июня 2010

Ваша проблема в том, что если пользователь закроет форму, объект будет удален.

Есть несколько способов справиться с этим, некоторые из них более элегантны, чем другие.

  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

По сути, централизуйте ее и запустите форму по требованию, вы можете переключить ее на другой шаблон проектирования, если вам нужен больший контроль или у вас много разных типов форм.

1 голос
/ 03 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...