如何从ShowDialog窗口返回值?

Lan*_*ine 3 vb.net popup showdialog winforms

frmMain

DoSomething()
My.Forms.frmMessage.ShowDialog(Me)
If AcceptButtonClicked Then
' Do Code
DoCode()
Else
' Cancel Button Pressed
DoOtherCode()
End If
DoMore()
Run Code Online (Sandbox Code Playgroud)

frmMessage

My.Forms.frmMain.AcceptButtonClicked = True
Run Code Online (Sandbox Code Playgroud)

有没有办法将对话窗口中的值传递回主窗口上的暂停线程?我想知道在填写弹出的表单后是否按下了"确定"或"取消"按钮.

Sty*_*xxy 6

您可以DialogResult在表单上使用该属性。该值将由您调用的 ShowDialog 函数返回。您还可以在按钮上设置此属性,以便 WinForms 处理表单属性的设置。

在您中,frmMessage 您必须相应地设置属性(选择您需要OKCancel的属性)。然后您可以轻松检查返回值:

If My.Forms.frmMessage.ShowDialog(Me) = System.Windows.Forms.DialogResult.OK Then
    ' OK button pressed
    DoCode()
Else
    ' Cancel button pressed
    DoOtherCode()
End If
Run Code Online (Sandbox Code Playgroud)

不要忘记,用户可以用另一种方式关闭表单,而不是用您的按钮关闭它(例如,用关闭按钮关闭它)。


Ste*_*eve 6

您应该在Form上设置AcceptButtonCancelButton属性,但是,AcceptButton应该将其属性DialogResult设置为OK,并将其设置CancelButtonCancel.

这样,当用户按下其中一个按钮时,ShowDialog调用将返回,您可以使用枚举DialogResult中的预定义值检查返回值.

DoSomething()
Dim result = My.Forms.frmMessage.ShowDialog(Me)
If result = DialogResult.OK Then
   ' Do Code
   DoCode()
Else
  ' Cancel Button Pressed
   DoOtherCode()
End If
DoMore()
Run Code Online (Sandbox Code Playgroud)


Way*_*yne 5

StyxxySteve的答案都适用于处理DialogResult主窗口中的 。然而,按钮的DialogResult属性Accept不应在属性窗口中设置,而应在验证发生在您的代码中设置。这样,如果用户在表单中输入错误数据,他们可以获得错误消息并修复它而不会丢失任何工作,而不是重新开始。

'code in Dialog Form
Private Sub btnAccept_Click(sender As System.Object, e As System.EventArgs) Handles btnAccept.Click
    If IsValid() = True Then
        DialogResult = Windows.Forms.DialogResult.OK
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)