|
2018/05/17(Thu) 16:15:45 編集(投稿者)
■No87395 (Genta さん) に返信 > ds.Tables["TableC"].Rows.Add(ds.Tables["TableC"].NewRow());//テーブル行コピー これ自体は行のコピーでは無く、単に「空の行」を追加しただけに過ぎませんよね。 それをループ内で幾度も繰り返しているので、空行が大量生産されるわけで。
> そこに配列ary3を格納したいと考えています。 そもそも、配列を使う意図は何でしょうか? 現状、ary3 はループ内で宣言されていますから、ループの外で 再利用することができません。配列の扱い方を間違っているように見えます。
> 実行しても何も値が入らない 少なくとも最終行には入っていますよ。 実行結果は、おそらくこうなるはず。
ds.Tables["TableC"].Rows[0]["dt3"] は DBNull ds.Tables["TableC"].Rows[1]["dt3"] は DBNull : : ds.Tables["TableC"].Rows[798]["dt3"] は DBNull ds.Tables["TableC"].Rows[799]["dt3"] は String
// .Rows[0]〜.Rows[798] は、ループ内で呼ばれた .Rows.Add によるもの // 最後の .Rows[799] は、ループの後で呼ばれた .Rows.Add によるもの
.Rows[799] の内容は、「index = 798 の時に TableB から計算した int 値」の文字列表現です。
index が 0〜797 の時の演算結果は、一時的には row3 に 格納されるものの、毎回、同じ行が上書き更新されているので、 最終的には一度も利用されること無く、毎回破棄されています。
★現状のコードは、こういう動作になっています★
DataTable dt3 = new DataTable(); //datatable作成 dt3.TableName = "TableC";
// TableC に、"dt3" という名の string 型のフィールドを追加 dt3.Columns.Add("dt3");
ds.Tables.Add(dt3);
// 空行を生成(まだ TableC には追加されていない) DataRow row3 = ds.Tables["TableC"].NewRow();
// 799 回のループ処理 for (int index = 0; index < 799; index++) { //TableC に空行を追加(row3 とは無関係)…これが799回呼び出される ds.Tables["TableC"].Rows.Add(ds.Tables["TableC"].NewRow());
// 要素数 800 の配列を、ループ処理のたびに再生成している(ループの外側では使わない) int[] ary3 = new int[800];
// [0] は使っているが、[1]〜[799] は未使用(無意味) ary3[0] = int.Parse(〜) - int.Parse(〜); // TableB からの演算
// 同じ行の同じ列に、データを何回も上書き代入している row3[0] = ary3[0]; //代入 } // ここでようやく、最初に生成した row3 が 800 行目に追加されることになる ds.Tables["TableC"].Rows.Add(row3); dataGridView1.DataSource = ds.Tables["TableC"];
★修正案 1 (そもそも配列なんて要らないのなら)★
var dt3 = ds.Tables.Add("TableC"); dt3.Columns.Add("dt3", typeof(int)); // int 型のフィールドとして追加 for (int index = 0; index < 799; index++) { int answer = int.Parse(〜) - int.Parse(〜); // TableB からの演算 dt3.Rows.Add(answer); } dt3.AcceptChanges(); // (AcceptChanges が必要ならこれも呼ぶ) dataGridView1.DataSource = dt3;
★修正案 2 (やっぱり配列が必要なら)★ var dt3 = ds.Tables.Add("TableC"); dt3.Columns.Add("dt3", typeof(int)); // int 型のフィールドとして追加 int[] ary3 = new int[799]; // 配列の初期化はループ前に一回だけ行う for (int index = 0; index < ary3.Length; index++) { ary3[index] = int.Parse(〜) - int.Parse(〜); // TableB からの演算 } Array.ForEach(ary3, answer => dt3.Rows.Add(answer)); // まとめて追加 dt3.AcceptChanges(); // (AcceptChanges が必要ならこれも呼ぶ) dataGridView1.DataSource = dt3;
|