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

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

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

DataGridViewからDataTableへの列追加

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

■91074 / inTopicNo.1)  DataGridViewからDataTableへの列追加
  
□投稿者/ usushio (22回)-(2019/05/25(Sat) 08:24:53)

分類:[C#] 

Visualstudio2017 Professional C#言語 で作成を行っております。

DataGridViewからDataTableへの列追加についてですが

複数のdatatableを
DataGridViewで1つずつ見ていき特定の列を抜き出して、新しく作成したdatatableに抜き出した列をまとめる
動作を行たいと思いこの動作を行っているのですが、
新しく作成したdatatableには、新しい列を追加したら、datatableを更新されてしまい
常に1つの列しか追加されていないじょうたいになってしまいます。

列をdatatableに追加する場合には、その前に新しく列を作成しておく必要があるのでしょうか。



  for (int tableCount = 0; tableCount < dataSet.Tables.Count; tableCount++)
            {
                
                for(int checkHeaderCount = 0; checkHeaderCount < checkData.Count; checkHeaderCount++)
                {
                    DataView dataView = new DataView(dataSet.Tables[tableCount]);

                    dataTable.Columns.Add(new DataColumn(checkData[checkHeaderCount]));

                    dataTable = dataView.ToTable(false, checkData[checkHeaderCount]);

                }
            }

引用返信 編集キー/
■91075 / inTopicNo.2)  Re[1]: DataGridViewからDataTableへの列追加
□投稿者/ 魔界の仮面弁士 (2185回)-(2019/05/25(Sat) 09:08:34)
No91074 (usushio さん) に返信
> dataTable.Columns.Add(new DataColumn(checkData[checkHeaderCount]));

これは、変数 dataTable が現在参照しているインスタンスに対して、
新たな列を 1 つ追加するためのコードですね。

なお、dataTable と dataSet.Tables[n] の関係は、提示されたコードからは明確にされていません。


> dataTable = dataView.ToTable(false, checkData[checkHeaderCount]);

これは、変数 dataTable が現在参照しているインスタンスを破棄して、
dataView.ToTable メソッドによって新たに生成されたインスタンスを
新たに参照しなおすためのコードですね。


> 新しく作成したdatatableには、新しい列を追加したら、datatableを更新されてしまい
> 常に1つの列しか追加されていないじょうたいになってしまいます。

そもそもなぜループ処理の中で、dataView.ToTable を何度も呼び続けているのでしょうか?
ループ中で checkData[] や checkHeaderCount が変化しているというわけでも無さそうですし…。
引用返信 編集キー/
■91076 / inTopicNo.3)  Re[2]: DataGridViewからDataTableへの列追加
□投稿者/ usushio (23回)-(2019/05/25(Sat) 15:15:49)
No91075 (魔界の仮面弁士 さん) に返信



>>dataTable = dataView.ToTable(false, checkData[checkHeaderCount]);
>
> これは、変数 dataTable が現在参照しているインスタンスを破棄して、
> dataView.ToTable メソッドによって新たに生成されたインスタンスを
> 新たに参照しなおすためのコードですね。
>
>
>>新しく作成したdatatableには、新しい列を追加したら、datatableを更新されてしまい
>>常に1つの列しか追加されていないじょうたいになってしまいます。
>
> そもそもなぜループ処理の中で、dataView.ToTable を何度も呼び続けているのでしょうか?
> ループ中で checkData[] や checkHeaderCount が変化しているというわけでも無さそうですし…。

checkData[]は、別の処理でヘッダーのみをリストアップし、その中から選択されたヘッダ(複数)を格納しています。
なのでcheckHeaderCountは選択した数によって変化していきます。

Totableに関しては、dataviewから指定の列を抜き出すだけのものと勘違いしておりました。
datatableも作成してかえすのですね。



引用返信 編集キー/
■91077 / inTopicNo.4)  Re[3]: DataGridViewからDataTableへの列追加
□投稿者/ 魔界の仮面弁士 (2186回)-(2019/05/25(Sat) 22:34:58)
2019/05/25(Sat) 22:39:33 編集(投稿者)

No91076 (usushio さん) に返信
> checkData[]は、別の処理でヘッダーのみをリストアップし、その中から選択されたヘッダ(複数)を格納しています。
> なのでcheckHeaderCountは選択した数によって変化していきます。

提示頂いたコードでは、ループ中でその「別の処理」が呼び出されていない以上、
ループ中で checkData が書き換わる要因がありません。
なのでやはり、ToTable を繰り返すのは不自然です。


もしも、
 dataTable.Columns.Add(new DataColumn(checkData[checkHeaderCount]));
 dataTable = dataView.ToTable(false, checkData[checkHeaderCount]);
ではなく、順番を入れ替えて
 dataTable = dataView.ToTable(false, checkData[checkHeaderCount]);
 dataTable.Columns.Add(new DataColumn(checkData[checkHeaderCount]));
にしていれば、また違った結果になっていたことでしょう。期待する結果かどうかは別として。


>>>dataTable = dataView.ToTable(false, checkData[checkHeaderCount]);
> Totableに関しては、dataviewから指定の列を抜き出すだけのものと勘違いしておりました。
> datatableも作成してかえすのですね。

はい。メソッドの説明文においても、
 『既存のDataView の行に基づく「新しい DataTable」を作成して返します。』
と明示されていますね。
https://docs.microsoft.com/ja-jp/dotnet/api/system.data.dataview.totable?view=netframework-4.8


また文法的には、戻り値で返すタイプのメソッドとしてなっているわけですから、
上記の説明を見るまでもなく、新しいインスタンスが返却されるものであると容易に想像できます。


仮に、既存の DataTable インスタンスを加工するタイプのメソッドだったとすれば、
 dataTable = usushio.ToTable(〜〜); // メソッドの戻り値として返す実装
の形式になることは考えにくいです。

どのインスタンスを書き換えるかを明示できるよう
 foo.Rebuild(dataTable); // 引数に既存の DataTable 参照を渡す実装
とか、
 dataTable.Foo(〜〜); // DataTable や DataSet に対する拡張メソッドでの実装
などの形式でないと不自然ですよね。(実際にこのような実装が用意されているわけではないですが)




引用返信 編集キー/
■91082 / inTopicNo.5)  Re[4]: DataGridViewからDataTableへの列追加
□投稿者/ WebSurfer (1824回)-(2019/05/26(Sun) 23:52:09)
マルチポストだそうですので、他にポスト先の URL を貼っておきます。

https://teratail.com/questions/191429
引用返信 編集キー/
■91087 / inTopicNo.6)  Re[5]: DataGridViewからDataTableへの列追加
□投稿者/ usushio (24回)-(2019/05/27(Mon) 14:13:14)
No91082 (WebSurfer さん) に返信
> マルチポストだそうですので、他にポスト先の URL を貼っておきます。
>
> https://teratail.com/questions/191429


大変失礼いたしました。
解決済み
引用返信 編集キー/
■91088 / inTopicNo.7)  Re[6]: DataGridViewからDataTableへの列追加
□投稿者/ WebSurfer (1825回)-(2019/05/27(Mon) 18:48:07)
No91087 (usushio さん) に返信

解決してないのであれば、teratail の方は閉じるとかルールに沿った対応をして
ここで質問を続けてはいかがですか? せっかくレスを貰っているのですから。
引用返信 編集キー/

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


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

このトピックに書きこむ