【问题标题】:How do I properly use checkboxes for running total in VB.net?如何正确使用复选框在 VB.net 中运行总计?
【发布时间】:2017-02-17 00:48:12
【问题描述】:

在 VB.net(上周开始)编程方面,我完全是新手。我在课堂上有一项作业,要求我使用 3 个复选框进行总计。

我已经弄清楚了一点。我现在的主要问题是,当我取消选中复选框时,计算变得很奇怪。到目前为止,这是我的代码:

Public Class frm1
    Dim HandbagAcc As Double = 0

    Private Sub chkBoxExtra_CheckedChanged(sender As Object, e As EventArgs) Handles chkBoxExtra.CheckedChanged
        '$9.99
        If chkBoxExtra.Checked = True Then
            HandbagAcc = HandbagAcc + 9.99
            txtBoxAcc.Text = FormatCurrency(HandbagAcc)
        End If
        If chkBoxExtra.Checked = False Then
            HandbagAcc = HandbagAcc - 9.99
            txtBoxAcc.Text = FormatCurrency(HandbagAcc)
        End If
    End Sub

    Private Sub chkBoxMatching_CheckedChanged(sender As Object, e As EventArgs) Handles chkBoxMatching.CheckedChanged
        '$7.99
        If chkBoxExtra.Checked = True Then
            HandbagAcc = HandbagAcc + 7.99
            txtBoxAcc.Text = FormatCurrency(HandbagAcc)
        End If

        If chkBoxExtra.Checked = False Then
            HandbagAcc = HandbagAcc - 7.99
            txtBoxAcc.Text = FormatCurrency(HandbagAcc)
        End If
    End Sub
    Private Sub chkBoxFour_CheckedChanged(sender As Object, e As EventArgs) Handles chkBoxFour.CheckedChanged
        '$3.95
        If chkBoxExtra.Checked = True Then
            HandbagAcc = HandbagAcc + 3.95
            txtBoxAcc.Text = FormatCurrency(HandbagAcc)
        End If

        If chkBoxExtra.Checked = False Then
            HandbagAcc = (HandbagAcc - 3.95)
            txtBoxAcc.Text = FormatCurrency(HandbagAcc)
        End If
    End Sub
End Class

当我第一次选中三个复选框时,数值相加得很好——但是,当我取消选中一两个复选框时,我的数字会变得不稳定,并且计算不会相加。我究竟做错了什么?

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 你处理不同的复选框事件,但在这些处理程序中你总是检查 chkBoxExtra
  • 哈哈。嗯……这很尴尬。非常感谢,Pro Grammer。我太瞎了我应该纠正那个然后去睡觉。
  • 不要仅仅为了告知您已解决问题而编辑问题。当您找到解决方案时,您接受解决问题的答案,或者如果没有现有答案涵盖它,则编写您自己的答案。 -- 欲了解更多信息,请拨打Tour 并阅读How does accepting an answer work?

标签: vb.net checkbox cumulative-sum


【解决方案1】:

正如评论所言,您在两个处理程序中选中了错误的复选框。

无论如何,我想对代码进行一些改进。如果您将价格作为标签添加到复选框中,则可以大大减少所需的代码量。

Dim HandbagAcc As Double = 0

Private Sub AnyCheckBox_CheckChanged(sender As Object, e As EventArgs) Handles chkBoxExtra.CheckedChanged, chkBoxMatching.CheckedChanged, chkBoxFour.CheckedChanged
    Dim currentChk As CheckBox = sender
    Dim price As Double = currentChk.Tag
    HandbagAcc = HandbagAcc + If(currentChk.Checked, price, -price)
    txtBoxAcc.Text = FormatCurrency(HandbagAcc)
End Sub

因此,添加标签后,您不需要为每个标签单独设置处理程序,并且可以通过同一个处理程序运行它: Handles chkBoxExtra.CheckedChanged, chkBoxMatching.CheckedChanged, chkBoxFour.CheckedChanged

通过sender 参数获取特定复选框并将其转换为CheckBox,以便您可以访问该类型的特定属性。

获取标签并将其转换为Double,这样您就可以从总数中添加/减去价值。

现在这一行:

HandbagAcc = HandbagAcc + If(currentChk.Checked, price, -price)

内联 If 允许您压缩以下内容:

If currentChk.Checked Then
    HandbagAcc += price
Else
    HandbagAcc -= price
End If

+= 是做x = x + y 的捷径

【讨论】:

    【解决方案2】:

    更简单的方法,利用更灵活的属性

    移除

    Dim HandbagAcc As Double = 0
    

    替换为

    Public ReadOnly Property HandbagAcc() as Double
        Get
            Dim Sum As Double
            If chkBoxExtra.Checked Then Sum += 9.99
            If chkBoxMatching.checked Then Sum += 7.99
            If chkBoxFour.Checked Then Sum +=  3.95
            Return Sum
        End Get
    End Sub
    

    创建通用处理程序

    Private Sub AnyCheckBox_CheckChanged(sender As Object, e As EventArgs) _
           Handles _
           chkBoxExtra.CheckedChanged, _
           chkBoxMatching.CheckedChanged, _ 
           chkBoxFour.CheckedChanged
    
        txtBoxAcc.Text = FormatCurrency(HandbagAcc)
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 2016-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多