Действительно простой способ справиться с этим - использовать экземпляр по умолчанию типа формы. В VB, начиная с 2005 года, каждый тип формы имеет экземпляр по умолчанию, к которому вы можете получить доступ через имя типа. Читайте здесь для получения дополнительной информации. В вашем случае вы можете сделать это:
'Display the form if it is not already displayed.
ExpenseEntry.Show()
'Activate the form if it is already displayed.
ExpenseEntry.Activate()
'Do the deed.
ExpenseEntry.OpenVouncher()
Тем не менее, экземпляры по умолчанию немного хитры. Они позволяют новичкам получать доступ к формам из любого места в своем проекте при определенных обстоятельствах, но у них также есть ограничения, которые могут вызвать проблемы. Но самое главное, они помогают предотвратить правильное обучение OOP, рассматривая формы иначе, чем другие типы. Если вы хотите сделать это так, как надлежащий разработчик просто объявит переменную для ссылки на текущий экземпляр формы:
Private expenseEntryDialogue As ExpenseEntry
Когда пришло время использовать форму, вы просто проверяете, является ли эта переменная ссылается на работающий экземпляр и использует его, если он есть, в противном случае создайте новый:
If expenseEntryDialogue Is Nothing OrElse expenseEntryDialogue.IsDisposed Then
expenseEntryDialogue = New ExpenseEntry
End If
expenseEntryDialogue.Show()
expenseEntryDialogue.Activate()
expenseEntryDialogue.OpenVoucher()
Третий вариант - реализовать свой собственный синглтон, то есть тип, который может иметь только один экземпляр. Вы, вероятно, не сделали бы этого в VB, учитывая, что экземпляр по умолчанию в основном является синглтоном с указанием потока c и делает это более автоматически, но, если вы хотите, вы можете сделать это:
Public Class ExpenseEntry
Private Shared _instance As ExpenseEntry
'The one and only instance of the type.
Public Shared ReadOnly Property Instance As ExpenseEntry
Get
If _instance Is Nothing OrElse _instance.IsDisposed Then
_instance = New ExpenseEntry
End If
Return _instance
End Get
End Property
'The constructor is private to prevent external instantiation.
Private Sub New()
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
End Sub
End Class
и тогда это:
ExpenseEntry.Instance.Show()
ExpenseEntry.Instance.Activate()
ExpenseEntry.Instance.OpenVoucher()