Как получить значения из формы диалога в 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
Наконец, если вы используете диалоговое окно, убедитесь, что вы установили результат диалога для кнопки.