2013-04-20 94 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#任何困難。

相關問題