篮球计分板选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
问题根源
- 未捕获MsgBox的返回值:所有代码都直接用
vbYes/vbNo做判断,没有接收MsgBox的返回结果。MsgBox会返回代表用户选择的枚举值,直接写If vbYes Then相当于判断布尔值True,所以不管用户选Yes还是No,这个条件都会成立,导致罚球得分每次都+1。 - 逻辑判断错误:部分尝试版本里的
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
相关产品推荐
相关产品推荐

