动态地循环checkbox以检查它是否为真

本文关键字:是否 检查 循环 checkbox 动态 | 更新日期: 2023-09-27 18:10:11

在一个表单上有37个复选框。我保留了每个复选框的名称:p1 p2 p3 ......... p36 p37。现在在VB中。. NET使用点字符串循环遍历所有控件,以控制强制转换并获取复选框的值。

下面是VB。. NET代码,我使用它,它工作。

    Dim Start As Integer = 0
        Dim StrAdd As String = ""
        For i As Integer = 1 To 37
            Const chk As String = "p"
            Dim chkBox As CheckBox = CType(per_box.Controls(chk & i), CheckBox)
            If chkBox.Checked = True Then
                If Start = 0 Then
                    StrAdd = StrAdd + "1"
                    Start = 1
                Else
                    StrAdd = StrAdd + ":1"
                End If
            Else
                If Start = 0 Then
                    StrAdd = StrAdd + "0"
                    Start = 1
                Else
                    StrAdd = StrAdd + ":0"
                End If
            End If
        Next

然而,在创建c#应用程序时,我试图做同样的事情,但它不起作用。有人能帮忙吗?

这是我的c#代码:
        string chk = "p";
        int start = 1;
        string str = "";
        for (int i = 1; i <= 37; i++)
        {
            chk = chk + i;
            CheckBox chkBox = (CheckBox)tab_patients.Controls[chk + i];
            if (chkBox.Checked == true)
            {
                if (start == 1)
                {
                    str = str + "1";
                    start = 0;
                }
                else
                {
                    str = str + ":1";
                }
            }
            else
            {
                if (start == 1)
                {
                    str = str + "0";
                    start = 0;
                }
                else
                {
                    str = str + ":0";
                }
            }
        }

动态地循环checkbox以检查它是否为真

删除这一行

chk = chk + i;

因为当您这样做时,您的chk在第一次迭代中变得像chk1一样然后通过Controls数组访问控制,像这样:

CheckBox chkBox = (CheckBox)tab_patients.Controls[chk + i];

你实际上在做这个:

CheckBox chkBox = (CheckBox)tab_patients.Controls[chk11];

幸运的是,您有chk11,因此它可能在第一次迭代中工作。

现在看看下一次迭代会发生什么,

对于下一次迭代,当前值为chk1chk将为chk+ichk12然后在。controls中再添加一个i,因此chk的值变成了chk122

CheckBox chkBox = (CheckBox)tab_patients.Controls[chk122];

是空的,因此不能工作。等等

你不应该修改chk的值。只需在Controls中使用它,但不要给它赋值。

也在VB中,你这样做:

If chkBox.Checked = True Then
                If Start = 0 Then
                    StrAdd = StrAdd + "1"
                    Start = 1
                Else
                    StrAdd = StrAdd + ":1"
                End If

,在c#中你这样做:

  if (chkBox.Checked == true)
            {
                if (start == 1)
                {
                    str = str + "1";
                    start = 0;
                }
                else
                {
                    str = str + ":1";
                }
            }

这两种逻辑略有不同。在Vb中比较的是0,如果为真,则附加1,但在c#中比较的是1,如果为真,则附加1

这是一个不好的编程习惯。为什么不把所有的复选框放在一个面板中,然后循环遍历面板的控件(本例中是复选框)呢?

Dim str as string=""
:For i as integer =0 to 36
:Select case panel1.controls(i).checked
:Case true
:Str=str & "1:"
:Case false
:Str=str & "0:" 
:End select
:Next i
:Str=microsoft.visualbasic.right(str,str.length-1)'remove the colon at last
这样可以避免许多不必要的变量,如start和CHK '常量和if语句。你在转换时不会有任何困难