Как получить значения из формы диалога в VB.NET?

У меня есть форма "frmOptions" с текстовым полем с именем "txtMyTextValue" и кнопка с именем "btnSave" для сохранения и закрытия формы при ее нажатии,

тогда я показываю эту диалоговую форму "frmOptions", когда на кнопку "btnOptions" нажимают на основную форму "frmMain", как этот

Private Sub btnOptions_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOptions.Click
    ShowOptionsForm()
End Sub

Private Sub ShowOptionsForm()
    Dim options = New frmOptions
    options.ShowDialog()
End Sub

Как я могу получить в основной форме "frmMain" значение, вставленное в текстовое поле "txtMyTextValue" при нажатии "btnSave"?

Ответ 1

Вы хотите захватить информацию из диалогового окна, только если результат OK (пользователь нажимает Save вместо Cancel или закрывает диалог другим способом), поэтому выполните следующее:

Private Sub ShowOptionsForm()
    Dim options = New frmOptions

    ' Did the user click Save?
    If options.ShowDialog() = Windows.Forms.DialogResult.OK Then
        ' Yes, so grab the values you want from the dialog here
        Dim textBoxValue As String = options.txtMyTextValue.Text
    End If
End Sub

Теперь внутри формы диалога вам нужно установить результат Windows.Forms.DialogResult.OK, когда пользователь нажимает кнопку, соответствующую действию OK диалогового окна, например:

Public Class frmOptions
    Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
        ' Set the result to pass back to the form that called this dialog
        Me.DialogResult = Windows.Forms.DialogResult.OK
    End Sub
End Class

Ответ 2

Вы можете использовать события, чтобы позаботиться об этом. При таком подходе форма настроек не должна быть Модальной, и пользователь может нажать кнопку "Сохранить" в любое время.

В frmOptions:

'You can expand the signature to take more than just a single String.
Friend Event SavedOptions(ByVal strData As String)

Private Sub btnSave_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSave.Click

    RaiseEvent SavedOptions(txtMyTextValue.Text)

End Sub

В frmMain:

Private Sub ShowOptionsForm()

    Dim options = New frmOptions

    AddHandler options.SavedOptions, AddressOf OnOptionsSave

    options.ShowDialog()

End Sub

Private Sub OnOptionsSave(ByVal strData As String)

    'Or whatever you want to do on frmMain with Options Data.
    MsgBox(strData)

End Sub

Ответ 3

Самый простой способ - добавить публичное свойство в форму frmOptions, которая возвращает внутреннюю строку, объявленную на глобальном уровне frmOptions

Dim strValue As String
Public Property MyStringValue() As String
    Get
       Return strValue
    End Get
End Property

Затем, когда ваш пользователь нажимает кнопку "ОК" для подтверждения своих вариантов, вы копируете значение текстового поля во внутреннюю переменную

Private Sub cmdOK_Click(sender As Object, e As System.EventArgs) Handles cmdOK.Click
    strValue = txtMyTextValue.Text
End Sub

Наконец, в frmMain вы используете такой код, чтобы получить вставленное значение

Private Sub ShowOptionsForm()
    Using options = New frmOptions()
       if DialogResult.OK = options.ShowDialog() Then
          Dim value = options.MyStringValue
       End If
    End Using
End Sub

Я предпочитаю избегать прямого доступа к внутренним элементам управления frmOptions, свойство предлагает косвенное направление, которое может использоваться для лучшей проверки входных данных, данных вашим пользователем.

Ответ 4

Вы можете получить доступ к значению из экземпляра frmOptions. Однако это нарушает закон demeter.

Вы должны представить значение с помощью свойства внутри вашего класса. Открытый класс frmOptions

Public ReadOnly Property MyTextValue As String
    Get
        Return Me.txtMyTextValue.Text

    End Get
End Property

Конечный класс

Затем вы можете получить доступ к значению:

 Private Sub ShowOptionsForm()
        Dim options = New frmOptions
        Dim frmOptionTextValue As String
        Dim frmOptionsDiagResult As DialogResult
        frmOptionsDiagResult = options.ShowDialog()
        If frmOptionsDiagResult = Windows.Forms.DialogResult.OK Then
            frmOptionTextValue = options.MyTextValue
        Else
            '...
        End If
    End Sub

Наконец, если вы используете диалоговое окно, убедитесь, что вы установили результат диалога для кнопки.