我在表单上有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";
}
}
}
答案 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#。