Я пытаюсь показать определенную форму с помощью управления 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
Ваша проблема в том, что если пользователь закроет форму, объект будет удален.
Есть несколько способов справиться с этим, один более элегантный, чем другой.
Это действительно зависит от того, что эти формы делают. Обычно я вижу, как ваш метод DoubleClick выполняет поиск, а затем создает экземпляр просто потому, что при создании экземпляров вы используете память, которая может не понадобиться, но это то, что может быть необходимо с учетом вашего приложения.
Пример поиска
Как просили в комментариях, если бы я сделал это по-другому, я бы использовал значение перечисления или даже простое целочисленное «ключевое» значение для тега. Затем я бы создал что-то вроде следующего, чтобы показать это.
Select Case myTag
Case 1
Dim formInstance As New Form1()
formInstance.Show()
Case Else
Dim formInstance As New Form2()
formInstance.Show()
End Select
В основном централизуйте его и запускайте форму по запросу, вы можете переключить это на другой шаблон проектирования, если хотите больше контроля или у вас есть много разных типов форм.
Форма утилизируется, когда ее закрывает пользователь. Один из вариантов - обработать событие Closing формы и просто скрыть ее вместо закрытия.