寻找更好的解决方案

时间:2019-09-29 14:06:09

标签: vb.net for-loop

我有以下代码。

当然,必须有一种更好的方式使用for / next或其他方式对此进行编码,但我只是无法使其正常工作

    If CheckBox1.CheckState Then bin(1) = "1" Else bin(1) = "0"   
    If CheckBox2.CheckState Then bin(2) = "1" Else bin(2) = "0"
    If CheckBox3.CheckState Then bin(3) = "1" Else bin(3) = "0"
    ..
    ..
    ..
    If CheckBox20.CheckState Then bin(20) = "1" Else bin(20) = "0"

2 个答案:

答案 0 :(得分:1)

好的,这应该可以工作,但是请记住,它假设您有20个CheckBoxes并且该数目永远不会改变,并且bin数组也永远不会改变元素数目。

Private Sub SyncCheckBoxestoBinValue()
    For i As Integer = 1 To 20
        bin(i) = Math.Abs(CInt(CType(Me.Controls("CheckBox" & i), CheckBox).Checked)).ToString
    Next
End Sub

这里可能需要进行解释。从内而外地工作,这就是了。

Me.Controls("CheckBox" & i)

这将指代在CheckBox1时匹配i=1,在CheckBox2时匹配i=2的控件。但是,因为该段代码旨在与所有类型的代码一起使用控件,它只能以对象类型返回它,而不是您要搜索的控件的特定类型。

要想对该结果做任何有意义的事情,我们需要告诉编译器它是CheckBox。因此,现在我们需要将最后的代码包装到其中。

CType(Me.Controls("CheckBox" & i), CheckBox)

现在,编译器将其识别为CheckBox,我们可以使用它。因此,您要为此目的从CheckBox is checked or not. You've used Checkstate , but personally I think it's a bit easier to use Checked中查找。所以...

CType(Me.Controls("CheckBox" & i), CheckBox).Checked

这将返回TrueFalse的结果。在VB.Net中,也可以将其视为-1(true)或0(false)。尽管您需要1或0,以便可以将此值分配给bin数组。我们的操作方式如下

Math.Abs(CInt(CType(Me.Controls("CheckBox" & i), CheckBox).Checked)).ToString

最后,您将1或0的结果分配给与bin数字相对应的CheckBox元素

“应该”这样做。

答案 1 :(得分:0)

也许使复选框成为列表,然后按var2_expression查询结果?为了使用linq来实现所有更好的可读性,

linq

您可能还希望将结果存储为Dim cbList = New List(Of CheckBox) From {checkBox1, checkBox2, checkBox3} Dim binTmp As List(Of String) = cbList.Select(Function(chk) If(chk.checkState, "1", "0")).ToList() bin = binTmp 而不是“ 1”,“ 0”以便进行进一步处理。