「frmOptions」フォームに「txtMyTextValue」というテキストボックスと「btnSave」というボタンがあり、クリックするとフォームを保存して閉じます。
次に、次のように、メインフォーム「frmMain」で「btnOptions」ボタンをクリックすると、このダイアログフォーム「frmOptions」が表示されます。
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
「btnSave」をクリックしたときにテキストボックス「txtMyTextValue」に挿入された値をメインフォーム「frmMain」で取得するにはどうすればよいですか?
結果が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
イベントを使用してこれを処理できます。このアプローチでは、設定フォームはモーダルである必要はなく、ユーザーはいつでも[保存]ボタンをクリックできます。
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
最も簡単な方法は、frmOptionsのグローバルレベルで宣言された内部文字列を返すパブリックプロパティをfrmOptionsフォームに追加することです。
Dim strValue As String
Public Property MyStringValue() As String
Get
Return strValue
End Get
End Property
次に、ユーザーが[OK]ボタンをクリックして選択を確認すると、テキストボックスの値を内部変数にコピーします
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の内部コントロールへの直接アクセスを避けたいと思います。プロパティは、ユーザーからの入力をより適切に検証するために使用できる間接参照を提供します。
FrmOptionsインスタンスから値にアクセスできます。しかし、これはデメテルの法則を破ります。
クラス内のプロパティで値を公開する必要があります。パブリッククラス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
最後に、ダイアログを使用している場合は、ボタンのダイアログ結果を必ず設定してください。