0

フォームに 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";
                }
            }
        }
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 を持っている次の反復では、chk1chk+iiechk12 になり、もう一度 .Controls に i をもう 1 つ追加すると、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";
                }
            }

2 つのロジックは少し異なります。Vb では 0 を比較し、true の場合は 1 を追加しますが、C# では 1 を比較し、true の場合は 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 に答える