Попробуйте этот перегруженный метод, разрешив как ссылку на форму, так и строковый параметр.
Вы можете передать экземпляр формы по умолчанию, назвав его напрямую:
ShowAddfrm(Form2)
или название формы:
ShowAddfrm("Form2")
или с использованием свойства Tag
элемента управления (или любого другого источника) в обработчике событий:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
ShowAddfrm(DirectCast(sender, Control).Tag.ToString())
End Sub
Есть разница:
- если вы передадите экземпляр Form, будет создан только этот экземпляр. Это означает, что если вы используете кнопку для отображения формы и нажимаете кнопку несколько раз, новые экземпляры не будут создаваться. Если вы закроете форму, появится новый экземпляр.
- Если вы используете строковую версию, каждый раз, когда вы вызываете этот метод, будет отображаться новый экземпляр формы, так что вы можете иметь несколько форм на экране.
Версия string использует Activator.CreateInstance для создания нового экземпляра формы с использованием его имени.
Sub ShowAddfrm(Of T As {Form, New})(ByVal form As T)
form.Show()
End Sub
Sub ShowAddfrm(formName As String)
Dim appNameSpace = Assembly.GetExecutingAssembly().GetName().Name
Dim form = CType(Activator.CreateInstance(Type.GetType($"{appNameSpace}.{formName}")), Form)
ShowAddfrm(form)
End Sub