すでにある DataTable に空白行を挿入したく displayTbl.Rows.InsertAt を試してみましたが、「この行は既にこのテーブルに属しています。'」というエラーが返ってきます。
ググってみてもこの方法でできるというサイトもあれば、ImportRow() でぶん回すべきと書いてあるものもあります。InsertAtがお手軽のように思えたので固守してトライしましたが、これって単に私のやり方がまずいだけですか?
それとも、つかえないってこと?
ImportRow() でぶん回すしかないなら仕方ないですが・・・件数が多いとなんか大変そう!?
DataTable DataTable 表示中のテーブル↓そのヘッダー
× string[] headerTxt ヘッダー名がカンマでつないである
〇 List<string> headerTxt ヘッダー名がカンマでつないである - 修正しました
C#
1 DataTable tbl = new DataTable(); 2 3 for (int i = 0; i < headerTxt[0].Split(',').Length; ++i) 4 { 5 // DataTable に行を定義する 6 if (i == 0) 7 tbl.Columns.Add(headerTxt[0].Split(',')[0], typeof(int)); 8 else 9 tbl.Columns.Add(headerTxt[0].Split(',')[i], typeof(string)); 10 } 11 12 DataRow[] dtRows = displayTbl.Select(); 13 int cnt = 0; 14 foreach (DataRow dr in dtRows) 15 { 16 tbl.ImportRow(dr); 17 if(rowIndex == cnt) 18 displayTbl.Rows.InsertAt(dr, rowIndex + 1); <-ここで出る 19 ++cnt; 20 }
Windows11 VS2019 C# WPF
「空白行」を追加したいという質問内容ですが、ソースを見るとdisplayTblにある行を処理しています。
貴方の言う「空白行」とは何なのでしょうか?
空白行を入れるというのがそもそも謎行動ですが、最終的にどうなることを期待して空白行を入れようとしているんでしょうか?
質問文を見ると、やりたいことはわかる気がするんですが、コードが全然違うことをしているので混乱します。参考にしたサイトを提示できますか?
そもそも何がしたいのですか? 「空白行を挿入」というのは、何かの目的があって、それを果たすための手段だと思いますが、目的も書いていただけませんか。
すみません「空白行」という表現が誤解を与えているようですが、単に1行挿入を任意の位置(行)にデータを追加したいためにこのような表現になりました。
「追加データはここに入れます。」ということを操作者に見せるためそこを空白行として表示しようと考えています。その後に該当するデータを入力するようにしようとおもっています。
このやり方はまずいですか?
> ソースを見るとdisplayTblにある行を処理しています。貴方の言う「空白行」とは何なのでしょうか
displayTblを触ると理解していましたが・・・違うの?
Rows.InsertAt(追加する行,挿入する位置)
https://docs.microsoft.com/ja-jp/dotnet/api/system.data.datarowcollection.insertat?view=netframework-4.8
ソース上では
displayTbl.Rows.InsertAt(dr, rowIndex + 1);
とdrを指定しています。
drはdisplayTblに属している行で空白行ではありません。
空白行なら何も入ってないDataRowなんじゃないんですか?
displayTblにある行であれば何かしらのデータが入っている行なんじゃないんですか?
> 単に1行挿入を任意の位置(行)にデータを追加したい
最終的には SQL Server などのデータベースにレコードを追加(INSERT)したいということでしょうか? 以下の記事の図1,図2のように、DataSet/DataTable をユーザーが編集して、編集結果を一気にデータベースに反映するというように。
DB 設計者のための明解 ADO.NET 第 1 回
https://docs.microsoft.com/ja-jp/previous-versions/cc482903(v=msdn.10)?redirectedfrom=MSDN
行のコレクションを保持している DataTable.Rows の型が DataRowCollection です。
https://docs.microsoft.com/ja-jp/dotnet/api/system.data.datatable.rows?view=net-6.0
https://docs.microsoft.com/ja-jp/dotnet/api/system.data.datarowcollection?view=net-6.0
DataRowCollection の任意の位置に行を挿入するメソッドは InsertAt です。
https://docs.microsoft.com/ja-jp/dotnet/api/system.data.datarowcollection.insertat?view=net-6.0
つまり、Rows をスキャンして挿入位置を決め、そこに InsertAt すればいいことになります。
挿入するオブジェクトは「空白行」なる意味不明なものではなく、DataRow です。
https://docs.microsoft.com/ja-jp/dotnet/api/system.data.datarow?view=net-6.0
DataRow の作成には、DataTable.NewRow を使用します。
https://docs.microsoft.com/ja-jp/dotnet/api/system.data.datatable.newrow?view=net-6.0
あなたのすべきことは、
1. スキャンして挿入位置を求める
2. DataRow を作成する
3. 作成した DataRow を挿入位置に挿入する
という三工程です。
質問のコード headerTxt[0].Split(',') からの想像ですが、データソースは CSV ファイルで、それを編集して結果を CSV ファイルに書き戻したい (もしくは CSV ファイルを生成したい) というようなことなのでしょうか? もしそうであれば、以下の記事のようにしてはいかがですか?
CSV ファイルを DataGridView に表示
http://surferonwww.info/BlogEngine/post/2020/09/11/show-date-in-csv-file-on-datagridview.aspx
回答1件
あなたの回答
tips
プレビュー