web-dev-qa-db-ja.com

VB.NETのダイアログフォームから値を取得する方法

「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」で取得するにはどうすればよいですか?

11
Max

結果が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
25
Karl Anderson

イベントを使用してこれを処理できます。このアプローチでは、設定フォームはモーダルである必要はなく、ユーザーはいつでも[保存]ボタンをクリックできます。

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
4
N0Alias

最も簡単な方法は、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の内部コントロールへの直接アクセスを避けたいと思います。プロパティは、ユーザーからの入力をより適切に検証するために使用できる間接参照を提供します。

3
Steve

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

最後に、ダイアログを使用している場合は、ボタンのダイアログ結果を必ず設定してください。

0
user3096633