动态循环选中以检查它是否为真

时间:2013-04-20 09:51:46

标签: c# .net vb.net winforms checkbox

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

以下是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";
                }
            }
        }

2 个答案:

答案 0 :(得分:3)

删除此行

chk = chk + i;

因为当您执行此操作时,您的chk会在第一次迭代时变为chk1 然后通过Controls数组访问控件,如下所示:

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

你实际上是这样做的:

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

幸运的是,你有chk11,所以它可能适用于第一次迭代。

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

对于下一次迭代,chk目前的值为chk1,将为chk+i,即chk12 再次在.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,如果为true,则追加1,但在C#中,您将比较1,如果是,则追加1

答案 1 :(得分:0)

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

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语句。你在转换时不会有任何困难 '上面的代码为c#。