C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

datatableの格納

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■87395 / inTopicNo.1)  datatableの格納
  
□投稿者/ Genta (1回)-(2018/05/17(Thu) 14:48:44)

分類:[C#] 

こんにちは

今、Datatableを作成して、そこに配列ary3を格納したいと考えています。
しかし、実行しても何も値が入らない、エラーがでない状況です。



//datatableを作成
DataTable dt3 = new DataTable(); //datatable作成
dt3.TableName = "TableC";
dt3.Columns.Add("dt3"); //datatableでの列作成
ds.Tables.Add(dt3);

DataRow row3 = ds.Tables["TableC"].NewRow();
for (int index = 0; index < 799; index++)

{
ds.Tables["TableC"].Rows.Add(ds.Tables["TableC"].NewRow());//テーブル行コピー
int[] ary3 = new int[800];
ary3[0]= (int.Parse((string)ds.Tables["TableB"].Rows[index + 1][0]))
     - (int.Parse((string)ds.Tables["TableB"].Rows[index][0]));

row3[0] = ary3[0]; //代入

}

ds.Tables["TableC"].Rows.Add(row3);               ←代入しているが値が入っていない
dataGridView1.DataSource = ds.Tables["TableC"];

以上 ご回答よろしくお願いします。

引用返信 編集キー/
■87396 / inTopicNo.2)  Re[1]: datatableの格納
□投稿者/ WebSurfer (1498回)-(2018/05/17(Thu) 15:04:04)
No87395 (Genta さん) に返信

ひょっとして、kenta = Ponta = Genta さんは同一人物?

もしそうであれば利用規約を読んでください。

"一貫して同じハンドルを使用し、場を混乱させないようにしましょう。
同じハンドルの方が質問の背景がわかりやすいです (自作自演をしたり
別人を装うのは回答者の善意を裏切る行為です)。"

違ったら失礼。
引用返信 編集キー/
■87397 / inTopicNo.3)  Re[1]: datatableの格納
□投稿者/ 魔界の仮面弁士 (1672回)-(2018/05/17(Thu) 15:34:53)
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;
引用返信 編集キー/
■87398 / inTopicNo.4)  Re[2]: datatableの格納
□投稿者/ Genta (3回)-(2018/05/17(Thu) 16:14:24)
No87397 (魔界の仮面弁士 さん) に返信

配列を使わないで、フィールドを使用する考え方、非常に勉強になりました。
配列有り無しの2つのパターンを教えていただきありがとうございます、魔界の仮面弁士 さん。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ