Покажите форму от TreeView в VB.NET

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

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
задан Caleb Thompson 3 June 2010 в 19:06
поделиться

2 ответа

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

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

  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
ответ дан 3 September 2019 в 00:04
поделиться

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

1
ответ дан 3 September 2019 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: