2013-04-20 54 views
0

我在表单上有37个复选框。我保留了每个复选框名称,如:p1p2p3.........p36p37。所以现在在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"; 
       } 
      } 
     } 

回答

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+ichk12 和你再次追加多一个我在.Controls,因此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

+0

谢谢:)一个小错误,我被卡住了足足5小时:P大是在这里#1 – 2013-04-20 10:15:00

+1

它发生在我们最好的:) – 2013-04-20 10:15:32

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#任何困难。

相关问题