Select 带按钮的 MessageBox 案例 Yes/No

Select case with a MessageBox with buttons Yes/No

我试图在登录表单期间引导用户。
如果用户单击 Yes 并且输入了昵称,则下一个表单将启动并关闭当前表单。

如果他们 select Yes 没有输入昵称,则会出现一条消息,通知用户名丢失并且不会显示其他表单。

如果他们 select No,则 MessageBox 应该关闭。

这是我想出的代码:

Public Sub BttPlay_Click(sender As Object, e As EventArgs) Handles BttPlay.Click
    Select Case MsgBox("The game is going to start, are you ready?", MessageBoxButtons.YesNo) And TxtUsername.Text = ""
        Case DialogResult.Yes And TxtUsername.Text <> ""
            nivel1.Show()
            Me.Close()
        Case DialogResult.Yes And TxtUsername.Text = ""
            MsgBox("You must write your username", MessageBoxButtons.OK)
        Case DialogResult.No
            Me.Show()
    End Select
    Me.Refresh()
End Sub

问题是无论是否已输入昵称,它都会显示输入昵称的消息。我做错了什么?

如果用户没有输入姓名,程序将无法继续进行,因此请先检查此条件,然后通知 return 如果不满足此条件。

然后询问用户是否要开始新游戏(可能是多余的,因为用户已经输入了名称并按下了按钮)。
如果用户回答 No,那么您将得到 DialogResult.No 结果,即 Return,这里没有其他事情可做。
否则,显示 nivel1 表单并 最终 关闭当前表单(见页脚注释):

Public Sub BttPlay_Click(sender As Object, e As EventArgs) Handles BttPlay.Click
    If TxtUsername.TextLength = 0 Then 
        MessageBox.Show("Please, name", "Name") 
        Return 
    End If
    
    If MessageBox.Show("Start?", "New Game", MessageBoxButtons.YesNo) = DialogResult.No Then Return 
    
    nivel1.Show() 
    Me.Close()
End Sub

如果你因为某些原因需要使用Select Case,你可以使用MessageBox的结果作为选择器。由于您可能只对阳性结果感兴趣,因此您可以先检查该情况,然后将其余的留给 Case Else(因为只有两种可能的情况):

Public Sub BttPlay_Click(sender As Object, e As EventArgs) Handles BttPlay.Click
    If txtDescription.TextLength = 0 Then
        MessageBox.Show("Please, name", "Name")
        Return
    End If

    Select Case MessageBox.Show("Start?", "New Game", MessageBoxButtons.YesNo)
        Case DialogResult.Yes
            nivel1.Show()
            Me.Close()
        Case Else
            ' NOP - It will just exit this method
            ' Me.Show() is not required, since Me is already shown
    End Select
End Sub

请注意,如果 Me 是起始表单,Me.Close() 将结束程序。
可能不想在此处关闭程序,因此请确保 Project->Properties->Application 中的 Shutdown mode 选项设置为 When last Form closes
您可以使用 Me.Hide() 作为替代。


既然你正在学习语言,我建议从一开始就设置 Option Strict On。它将帮助您避免在编写一堆代码后难以发现的错误。
Visual Studio,调试器和 Intellisense 都将帮助找出代码中的问题,并建议如何修复它。

如果您设置此选项 On(连同所有其他相关选项), 使用 Visual Studio 常规选项对话框。
TOOLS 菜单中,查看: Options->Projects and Solutions->VB Defaults 并将所有设置为 On

根本问题是 Select Case 仅适用于评估单个变量的条件。如果你想考虑另一个变量的条件,那么你不能使用 Select Case 并且必须退回到 If-Then / ElseIf-Then / Else.

为了让您的代码按照编写的方式工作(搁置 Jimi 建议的重新设计),您可以这样做:

Dim response = MessageBox.Show(...)
If response = MessageBoxResult.Yes AndAlso TxtUserName.Text <> "" Then
    '...
ElseIf response = MessageBoxResult.Yes AndAlso TxtUserName.Text = "" Then
    '...
ElseIf response = MessageBoxResult.No Then
    '...
End If