質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

5538閲覧

DataTable に空白行を挿入したく displayTbl.Rows.InsertAt だと「この行は既にこのテーブルに属しています。'」というエラーが返る

byori

総合スコア72

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

1クリップ

投稿2022/07/15 06:57

編集2022/07/15 12:12

すでにある 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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2022/07/15 07:18

「空白行」を追加したいという質問内容ですが、ソースを見るとdisplayTblにある行を処理しています。 貴方の言う「空白行」とは何なのでしょうか?
Zuishin

2022/07/15 07:27

空白行を入れるというのがそもそも謎行動ですが、最終的にどうなることを期待して空白行を入れようとしているんでしょうか?
KOZ6.0

2022/07/15 07:31

質問文を見ると、やりたいことはわかる気がするんですが、コードが全然違うことをしているので混乱します。参考にしたサイトを提示できますか?
退会済みユーザー

退会済みユーザー

2022/07/15 08:19

そもそも何がしたいのですか? 「空白行を挿入」というのは、何かの目的があって、それを果たすための手段だと思いますが、目的も書いていただけませんか。
byori

2022/07/15 11:49

すみません「空白行」という表現が誤解を与えているようですが、単に1行挿入を任意の位置(行)にデータを追加したいためにこのような表現になりました。 「追加データはここに入れます。」ということを操作者に見せるためそこを空白行として表示しようと考えています。その後に該当するデータを入力するようにしようとおもっています。 このやり方はまずいですか?
byori

2022/07/15 11:53

> ソースを見るとdisplayTblにある行を処理しています。貴方の言う「空白行」とは何なのでしょうか displayTblを触ると理解していましたが・・・違うの?
YAmaGNZ

2022/07/15 12:25 編集

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にある行であれば何かしらのデータが入っている行なんじゃないんですか?
退会済みユーザー

退会済みユーザー

2022/07/15 12:06

> 単に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
Zuishin

2022/07/15 12:38 編集

行のコレクションを保持している 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 を挿入位置に挿入する という三工程です。
退会済みユーザー

退会済みユーザー

2022/07/15 21:34

質問のコード headerTxt[0].Split(',') からの想像ですが、データソースは CSV ファイルで、それを編集して結果を CSV ファイルに書き戻したい (もしくは CSV ファイルを生成したい) というようなことなのでしょうか? もしそうであれば、以下の記事のようにしてはいかがですか? CSV ファイルを DataGridView に表示 http://surferonwww.info/BlogEngine/post/2020/09/11/show-date-in-csv-file-on-datagridview.aspx
guest

回答1

0

自己解決

皆様、大変お世話になりました。

少々勘違いがあったようでコードを下記のように書き換えてうまくいくようになりました。

ありがとうございました。

C#

1 try 2 { 3 DataTable tbl = new DataTable(); 4 5 for (int i = 0; i < headerTxt[0].Split(',').Length; ++i) 6 { 7 // DataTable に行を定義する 8 if (i == 0) 9 tbl.Columns.Add(headerTxt[0].Split(',')[0], typeof(int)); 10 else 11 tbl.Columns.Add(headerTxt[0].Split(',')[i], typeof(string)); 12 } 13 14 DataRow[] dtRows = displayTbl.Select(); 15 int cnt = 0; 16 foreach (DataRow dr in dtRows) 17 { 18 var addRow = tbl.NewRow(); // <- ここが抜けていた 19 20 tbl.ImportRow(dr); 21 if (rowIndex == cnt) 22 tbl.Rows.InsertAt(addRow, rowIndex + 1); // <- 挿入先が間違っていた 23 ++cnt; 24 } 25 grid1.ItemsSource = tbl.DefaultView;   // 新しく作ったものを表示する 26 } 27 catch(Exception ex) { }

投稿2022/07/16 00:17

byori

総合スコア72

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2022/07/16 00:50

ソースを見る限り、DataTableをコピーしてある行に空白行を挿入したいってことなんですかね? DataTable tbl = displayTbl.Copy(); tbl.Rows.InsertAt(tbl.NewRow(), rowIndex + 1); grid1.ItemsSource = tbl.DefaultView; で終わりだったりするんじゃないですか?
byori

2022/07/16 01:44

うっ、!そんな短いコードで出来ちゃうの!? この方がシンプルで分かりやすいですね。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問