0

2 つの並列foreachループを実行しようとしています

コード:

foreach (Control c in panel1.Controls)
{
    if (c.GetType() == typeof(CheckBox))
    {
        if (((CheckBox)c).Checked) 
        {
            id = name; 
        }
    }
}

if (id != "")
{
    foreach (Control cd in panel1.Controls)
    {
        if (cd.GetType() == typeof(TextBox) && cd.Name == name)
        {
            val = cd.Text.ToString();

            if (val != "")
            {
                con3.Open();
                SqlCommand cmd3 = new SqlCommand("insert into Employee_Ear_Ded values('" + Convert.ToInt32(name) + "','" + Convert.ToInt32(comboBox1.Text) + "','" + drpPayHead.Text + "','" + Convert.ToDouble(val) + "','" + comboBox2.Text + "')", con3);
                cmd3.ExecuteNonQuery();
                con3.Close();
            }
            else
            {
                MessageBox.Show("Please Enter Value");
            }
        }
    }
}
else
{
    MessageBox.Show("No Employee Selected");
}

ここでは、それぞれのチェックボックスがチェックされているテキスト ボックスの値を挿入しようとしています。
私が使用しているコードは、最後にチェックされた値のみを挿入しています。
各チェックボックスとそれぞれのテキストボックスに対してどのように実行できますか?
コントロールは実行時に作成されます。

4

4 に答える 4

3

Enumerable 拡張OfTypeを使用してチェックボックスのみをループし、次に同じ構文で テキストボックスをループできます

foreach (CheckBox c in panel1.Controls.OfType<CheckBox>())
{
    if (c.Checked)
    {
        foreach(TextBox cd in panel1.Controls.OfType<TextBox>())
        {
            string val = cd.Text;
            if (val != "" && cd.Name == name)
            {
              con3.Open();
              SqlCommand cmd3 = new SqlCommand("insert into ....", con3)
              cmd3.ExecuteNonQuery();
              con3.Close();
            }
        }
    }
}

そうは言っても、パラメーター化されたクエリを探すことをお勧めします。
文字列値を連結して作成されたデータベース コマンド テキストは非常に危険であり ( SQL インジェクション)、入力文字列に無効な文字が含まれていると失敗する可能性があります。

また、現在のコードでは、sql コマンドが間違っているようです。
コードは変数name(文字列) を整数に変換し、結果を一重引用符で囲みます。これは、値を受け取るデータベース フィールドがテキスト型であり、整数変換が不要である
と言っているようなものです。name

于 2013-06-05T11:15:35.220 に答える
1

反復内で反復します。

ループ内でループします。

別の、おそらくより良い方法は、チェックボックスの未使用のプロパティ「タグ」をテキストボックスの対応するコントロールに設定することです。

両方のオブジェクトをリンクするのは非常に簡単で、適切なメソッド設計により、両方の反復を保存できます。

于 2013-06-05T11:16:15.453 に答える
0

チェックボックスをテキストボックスにリンクする方法がわかりません。上部のネストされたループ内の「id=name」は、ループ変数を含まないためほとんど意味がありません。すべての「チェックされた」チェックボックスのリストが必要だと思います。これは、それを達成するための 1 つの方法です。同じ方法で TextBox を反復処理して、その内容にアクセスできます。

var namesOfCheckedBoxes = panel1.Controls.OfType<CheckBox>().Where(cb=>cb.Checked).Select(cb=>cb.Name);
于 2013-06-05T11:16:11.163 に答える
0

私はこれを試してみましたが、うまくいきました

foreach (CheckBox c in panel1.Controls.OfType<CheckBox>())
{
if (c.Checked)
{
    var name = c.Name;
    foreach(TextBox cd in panel1.Controls.OfType<TextBox>())
    {
        string val = cd.Text;
        if (val != "" && cd.Name == name)
        {

            con3.Open();
            SqlCommand cmd3 = new SqlCommand("insert into ...", con3);
            cmd3.ExecuteNonQuery();
            con3.Close();
        }
    }
}

現在、それぞれの CheckBox がチェックされている TextBox のデータベースに値を格納しています

于 2013-06-06T08:24:17.757 に答える