■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 に対する拡張メソッドでの実装 などの形式でないと不自然ですよね。(実際にこのような実装が用意されているわけではないですが)
|
|