VB. NET 2019 Открыть форму из другой формы - PullRequest
0 голосов
/ 21 апреля 2020

Я знаю, что это довольно распространенная тема c, и ее следовало решить из предыдущих постов. Но то, что я испытываю, похоже, не имеет решения онлайн: у меня есть форма с именем ExpenseEntry, в которой есть подпроцедура с именем Public Sub OpenVoucher. Я хочу вызвать этот саб из другой формы, для которой я использую следующий код:

        Dim ExpForm As New ExpenseEntry
         ExpForm.Show()
        ExpForm.OpenVoucher()

Хотя это работает достаточно хорошо, проблема заключается в том, что каждый раз, когда я нажимаю кнопку, открывается новое окно ExpenseEntry , В соответствии с тем, как я разработал приложение, повтор windows недопустим, и одновременно должно быть доступно только одно окно. Я пробовал различные методы для ограничения более чем одной формы, например, используя переменную для управления формой, но это вызывает другие проблемы. Если я использую Application.OpenForms, но все еще не решает проблему. Ранее я обращался по этому поводу по следующей ссылке: Текстовое поле не обновляется

Я использую VB. NET 2019, который не позволяет запускать экземпляр по умолчанию формы, подобной Form.Show. Я знаю, что это плохая практика, но до VB с этим было легче справиться. NET 2017.

Теперь, создав переменную формы и запустив, что создает бесконечное l oop, где у меня не может быть только одного экземпляр формы, работающей в одном потоке.

1 Ответ

1 голос
/ 21 апреля 2020

Действительно простой способ справиться с этим - использовать экземпляр по умолчанию типа формы. В 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...