You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

篮球计分板选No仍自动+1?VB.NET代码问题求助

篮球计分板罚球得分逻辑问题

问题场景

开发篮球计分板,主窗体显示最终得分和罚球得分,通过控制器窗体传递数据。控制器有得分和罚球的±1按钮,为简化操作,点击主得分+1按钮后弹出「是否为罚球?」的Yes/No对话框,期望:

  • 选Yes:罚球得分+1
  • 选No:罚球得分不加分
    但目前选No时罚球得分仍会自动+1。

原始及尝试代码

原始代码:

Private Sub btnT1Sp1_Click(sender As Object, e As EventArgs) Handles btnT1Sp1.Click 'Score +1
        Form1.lblT1pnts.Text = Val(Form1.lblT1pnts.Text) + 1
        MsgBox("Was this a freethrow?", vbQuestion + vbYesNo, "Controller")
        If vbYes Then
            Form1.lblFreeThrowsT1.Text = Val(Form1.lblFreeThrowsT1.Text) + 1
        Else
            Me.Close()
            Me.Dispose()
        End If
    End Sub

尝试过的修改版本:
版本1:

Private Sub btnT1Sp1_Click(sender As Object, e As EventArgs) Handles btnT1Sp1.Click 'Score +1
        Form1.lblT1pnts.Text = Val(Form1.lblT1pnts.Text) + 1
        MsgBox("Was this a freethrow?", vbQuestion + vbYesNo, "Controller")
        If vbYes Then
            Form1.lblFreeThrowsT1.Text = Val(Form1.lblFreeThrowsT1.Text) + 1
        Else
            Form1.lblFreeThrowsT1.Text = Val(Form1.lblFreeThrowsT1.Text) - 1
            Me.Close()
            Me.Dispose()
        End If
    End Sub

版本2:

Private Sub btnT1Sp1_Click(sender As Object, e As EventArgs) Handles btnT1Sp1.Click 'Score +1
        Form1.lblT1pnts.Text = Val(Form1.lblT1pnts.Text) + 1
        MsgBox("Was this a freethrow?", vbQuestion + vbYesNo, "Controller")
        If vbYes Then
            Form1.lblFreeThrowsT1.Text = Val(Form1.lblFreeThrowsT1.Text) + 1
        Elseif vbNo Then
            Me.Close()
            Me.Dispose()
        End If
    End Sub

版本3:

Private Sub btnT1Sp1_Click(sender As Object, e As EventArgs) Handles btnT1Sp1.Click 'Score +1
        Form1.lblT1pnts.Text = Val(Form1.lblT1pnts.Text) + 1
        MsgBox("Was this a freethrow?", vbQuestion + vbYesNo, "Controller")
        If vbYes Then
            Form1.lblFreeThrowsT1.Text = Val(Form1.lblFreeThrowsT1.Text) + 1
        Elseif vbNo Then
            Form1.lblFreeThrowsT1.Text = Val(Form1.lblFreeThrowsT1.Text) - 1
        End If
    End Sub

版本4:

Private Sub btnT1Sp1_Click(sender As Object, e As EventArgs) Handles btnT1Sp1.Click 'Score +1
        Form1.lblT1pnts.Text = Val(Form1.lblT1pnts.Text) + 1
        MsgBox("Was this a freethrow?", vbQuestion + vbYesNo, "Controller")
        If vbYes Then
            Form1.lblFreeThrowsT1.Text = Val(Form1.lblFreeThrowsT1.Text) + 1
        Elseif vbNo Then
            Return
        End If
    End Sub

问题根源

  1. 未捕获MsgBox的返回值:所有代码都直接用vbYes/vbNo做判断,没有接收MsgBox的返回结果。MsgBox会返回代表用户选择的枚举值,直接写If vbYes Then相当于判断布尔值True,所以不管用户选Yes还是No,这个条件都会成立,导致罚球得分每次都+1。
  2. 逻辑判断错误:部分尝试版本里的Elseif vbNo写法同样无效,本质还是没有获取到用户的实际选择结果。

修正后的代码

Private Sub btnT1Sp1_Click(sender As Object, e As EventArgs) Handles btnT1Sp1.Click 'Score +1
    ' 先给主得分加1
    Form1.lblT1pnts.Text = Val(Form1.lblT1pnts.Text) + 1
    ' 弹出对话框并接收用户选择结果
    Dim userChoice As DialogResult = MsgBox("Was this a freethrow?", vbQuestion + vbYesNo, "Controller")
    ' 根据用户选择执行对应操作
    If userChoice = vbYes Then
        Form1.lblFreeThrowsT1.Text = Val(Form1.lblFreeThrowsT1.Text) + 1
    End If
    ' 选No时不做罚球加分操作,直接关闭控制器窗体
    Me.Close()
    Me.Dispose()
End Sub

额外优化建议

  • 避免直接跨窗体操作控件:可以通过属性、事件或委托传递数据,降低窗体间的耦合度。
  • 替换Val为更安全的类型转换:使用Integer.TryParse处理得分转换,避免非数字文本导致的异常,示例:
Private Sub UpdateScore(scoreLabel As Label, change As Integer)
    Dim currentScore As Integer
    If Integer.TryParse(scoreLabel.Text, currentScore) Then
        scoreLabel.Text = (currentScore + change).ToString()
    End If
End Sub

调用时:

UpdateScore(Form1.lblT1pnts, 1)
If userChoice = vbYes Then
    UpdateScore(Form1.lblFreeThrowsT1, 1)
End If

内容的提问来源于stack exchange,提问作者LeakyEarth2000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 13:30:53