【问题标题】:Is there a simpler way to process check boxes?有没有更简单的方法来处理复选框?
【发布时间】:2014-04-17 01:21:04
【问题描述】:

在 vb.net 中,我有一个包含四个复选框的表单。每个复选框表示(选中时)用户想要在他们的订单中添加特殊指令。代码如下所示:

        If SpecialInstruction1CheckBox.Checked Then
            AddSpecialInstruction(SPECIAL_INSTRUCTION_1_String)
        End If
        If SpecialInstruction2CheckBox.Checked Then
            AddSpecialInstruction(SPECIAL_INSTRUCTION_2_String)
        End If
        If SpecialInstruction3CheckBox.Checked Then
            AddSpecialInstruction(SPECIAL_INSTRUCTION_3_String)
        End If
        If SpecialInstruction4CheckBox.Checked Then
            AddSpecialInstruction(SPECIAL_INSTRUCTION_4_String)
        End If

我觉得这段代码不必要地冗长,感觉重复,并且可以简化。我将如何去做,或者这不像感觉的那样“错误”?

【问题讨论】:

  • 它们是一个 checkBoxList 还是四个单独的复选框?
  • 虽然它已经过时了,但这篇关于控制阵列的文章可能会有用:msdn.microsoft.com/en-us/library/aa289500(v=vs.71).aspx
  • @Tim 它们是四个独立的复选框。
  • @BobKaufman 谢谢,我会去看看。
  • 指令是互斥的还是可以组合在一起的?如果它们是互斥的,您可以使用 Select Case 语句,该语句将在找到第一个选项后退出。 (但如果是这种情况,您可以只使用单选按钮)

标签: vb.net if-statement checkbox performance multipleselection


【解决方案1】:

实际上,代码本身并没有那么不好。这主要取决于 AddSpecialInstruction 所做的,确切地说。根据您的具体情况,最好将字符串指令列表传递给它:

Dim list As New List(Of String)

If SpecialInstruction1CheckBox.Checked Then list.Add(SPECIAL_INSTRUCTION_1_String)
If SpecialInstruction2CheckBox.Checked Then list.Add(SPECIAL_INSTRUCTION_2_String)
If SpecialInstruction3CheckBox.Checked Then list.Add(SPECIAL_INSTRUCTION_3_String)
If SpecialInstruction4CheckBox.Checked Then list.Add(SPECIAL_INSTRUCTION_4_String)

AddSpecialInstructions(list)

由于您还需要代码收缩,我将If 语句放在一行中。更短的变量名也会对此有所帮助。

【讨论】:

    【解决方案2】:

    第一个问题是您的特殊指令不应存储在单独的变量中。它们应该存储在数组或其他类型的列表中。然后你可以通过索引访问它们(例如specialInstructions(1))。

    然后你可以像这样按索引遍历复选框:

    For i As Integer = 1 to 4
        Dim box As CheckBox = DirectCast(Me.Controls("SpecialInstruction" & i.ToString() & "CheckBox"), CheckBox)
        If box.Checked Then list.Add(specialInstructions(i))
    Next
    

    或者,您可以将对复选框的引用存储在数组中,然后更轻松地循环它们,例如:

    Dim checkBoxes() As CheckBox = {
        SpecialInstruction1CheckBox,
        SpecialInstruction2CheckBox,
        SpecialInstruction3CheckBox,
        SpecialInstruction4CheckBox}
    
    ' ...
    
    For i As Integer = 0 to checkBoxes.Length - 1
        If checkBoxes(i).Checked Then list.Add(specialInstructions(i))
    Next
    

    另一种选择是将特殊说明存储在每个复选框的Tag 属性中,然后您可以从控件中检索值,如下所示:

    For Each i As CheckBox In checkBoxes
        If i.Checked Then list.Add(i.Tag)
    Next
    

    但这只有在您不需要在代码的其他地方重用这些特殊指令值时才有意义。

    【讨论】:

    • Capitals 表明指令实际上是常量,但是是的,如果可能的话,数组是一个有趣的解决方案。当然,所有指令都必须绑定到复选框。
    • 不过,我真的不推荐第一种选择。按名称浏览控件会使代码更短,但不是最佳的。
    • @Crono,我同意。我更喜欢后一种将引用存储在数组中的选项。购买“最佳”取决于一个人想要达到的目标。
    • 好吧,鉴于 OP 担心他的实际代码的效率(这还不错),我想说他应该担心降低其性能。 :p
    • @Crono 好吧,因为“效率低下”实际上并不是一个词,所以我不想推测这可能意味着什么 :)
    猜你喜欢
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2011-05-05
    相关资源
    最近更新 更多