0

チェックボックス列を最初の列とするデータ グリッド ビューがあります。私たちが望むのは、ユーザーが行をチェックしたときに、チェックされたすべての行が別のフォームのテキストボックスに移動することです。そのために以下を書きました。ただし、問題は、複数の行をチェックしても、常に最後にチェックされた行のデータを次のフォームに送信することです。チェックされたすべての行データではありません

private void btngnvoucher_Click(object sender, EventArgs e)
{
    // foreach(DataGridViewRow row in dataGridView1.Rows)
    for (int x = 0; x < dataGridView1.RowCount;x++ )
    {
        // DataGridViewCheckBoxCell ch1  = (DataGridViewCheckBoxCell)row.Cells[0];
        DataGridViewCheckBoxCell ch1 = (DataGridViewCheckBoxCell)dataGridView1.Rows[x].Cells[0];

        if (ch1.Value != null)
        {
            for (int a = 0; a < 6; a++)
            {
                for (int col = 1; col < 5; col++)
                {
                    TextBox theText1 = (TextBox)vobj.Controls[col - 1];

                    // theText1.Text = row[x].Cells[col].Value.ToString();
                    theText1.Text = dataGridView1.Rows[x].Cells[col].Value.ToString();

                }

                // a = a + 1;
                break;

            }
        }
    }

    vobj.Show();
}
}

}

これを解決するために何ができるか教えてもらえますか?

4

2 に答える 2

0

あなたの問題の原因は、変数aが何かをすることを意図しているが、それに対して何もしていないことのようです。これは、セルを調べるコードによって入力されるテキスト ボックスの行を参照することを意図しているようです。

現状では、このコードは次のとおりです。

for (int col = 1; col < 5; col++)
{
    TextBox theText1 = (TextBox)vobj.Controls[col - 1];

    // theText1.Text = row[x].Cells[col].Value.ToString();
    theText1.Text = dataGridView1.Rows[x].Cells[col].Value.ToString();

}

すべての行に同じ 4 つのテキスト ボックスを入力しています。


とはいえ、あなたのコードには他にも多くの問題があり、それらを修正するとおそらく問題がより明確になります。

まず、可能な限り foreach ループを使用して、DataGridView. それは、はるかにクリーンで保守しやすいものになります。たとえば、必要な列をループする場合、別の列が追加されることはないと想定します。

次へ - インデックスではなく名前で列を参照してみてください。コードを維持するとき、それははるかに脆弱ではありません。

チェックボックスがチェックされているかどうかを確認するためのチェックが正しくありません。ユーザーがボックスを選択してからチェックを削除すると、まだカウントされます。null をチェックし、null でない場合は true をチェックする必要があります。

これらの変更により、次のようになります。

foreach (DataGridViewRow r in dataGridView1.Rows)
{
    if (r.Cells["CheckBox"].Value != null && (bool)r.Cells["CheckBox"].Value)
    {
        foreach (DataGridViewCell c in r.Cells)
        {
            if (c.ValueType == typeof(string))
            {
                // The code here is still ugly - there is almost certainly
                // a better design for what you are trying to do but that is
                // beyond the scope of the question.
                // Plus it still has your original bug of referencing the 
                // same row of text boxes repeatedly.
                TextBox theText1 = (TextBox)vobj.Controls[c.ColumnIndex];
                theText1 += c.Value.ToString();
            }
        }
    }
}
于 2012-06-07T19:38:50.647 に答える
0

これの代わりに:

theText1.Text = dataGridView1.Rows[x].Cells[col].Value.ToString();

試す:

theText1.AppendText(dataGridView1.Rows[x].Cells[col].Value.ToString());
于 2012-06-07T17:19:08.433 に答える