0

我在一个表单上有 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";
                }
            }
        }
4

2 回答 2

3

删除此行

chk = chk + i;

因为当你这样做时,你chk就像chk1第一次迭代一样,然后你通过Controls数组访问控件,如下所示:

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

你实际上是在这样做:

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

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

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

chk对于当前具有 value的下一次迭代,chk1将是chk+iie chk12 ,并且您再次在 .Controls 中附加一个 i,因此chkvalue 变为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

于 2013-04-20T09:59:25.950 回答
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 'constant 和 if 语句。将上面的代码转换为 c# 不会有任何困难。

于 2013-04-20T10:41:02.553 回答