DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataTableとDataGridViewの編集

環境/言語:[C#、.NET 2.0]
分類:[.NET]

みなさん、はじめまして。

DataTableとDataGridViewについての質問です。
現在、DataTableをDataGridViewにバインドして表示し、編集させています。

これにコピーなどのデータ編集機能を追加したいのですが、2つ方法が考えられます。
・DataTableを編集する
・DataGridViewを編集する

一般的にはどちらを利用するのでしょうか?
理由もあれば、合わせてお願いします。
■No29432に返信(とらさんの記事)
> これにコピーなどのデータ編集機能を追加したいのですが、2つ方法が考えられます。
> ・DataTableを編集する
> ・DataGridViewを編集する

いずれか一方のみを排他的に使うものではなく、用途ごとに
「どちらのデータを扱いたいのか」で決めれば良いと思います。


たとえば DataView に対してフィルターをかけている場合や、
リレーションに対して BindingSource 等を張っている場合、あるいは
DataTable 上の一部の列しかバインドしていない場合などにおいては、
DataGridView に表示されるのは、データの一部だけとなりますから、
表示されていないデータもコピーあるいは編集したい場合には、
バインド元データを操作する必要があるはずです。

その逆に、DataGridView からのアプローチが必要なケースもあります。
たとえば非バインド列が含まれる場合や、編集中の未確定行の情報などです。

そのほか、「コピーされたデータを 3 行目に挿入する」などという処理が
ある場合は、それが DataTable の格納順としての 3 行目なのか、
それとも現在の DataGridView 上での並び順の 3 行目なのか、あるいは
特定の列でソートした場合の 3 行目なのか、といった話にもなるでしょう。


> 一般的にはどちらを利用するのでしょうか?
データバインドされた場合に限定して言えば、読み書きの処理として
高速なのは DataTable 側を使う方法なのですが、上記のような理由から、
どちらを使うべきであるのかは、ケースバイケースといったところです。


ちなみに DataGridViewRow の DataBoundItem プロパティからは、
バインド元のデータを得ることができます。これは通常、DataRowView 型の
値として取得されますので、DataRowView の Row プロパティ経由で
バインド元の DataRow に遡ることも可能です。
(バインドされていない場合は、DataBoundItem プロパティは null です)
お返事ありがとうございます。

>その逆に、DataGridView からのアプローチが必要なケースもあります。
>たとえば非バインド列が含まれる場合や、編集中の未確定行の情報などです。

>それとも現在の DataGridView 上での並び順の 3 行目なのか、あるいは
>特定の列でソートした場合の 3 行目なのか、といった話にもなるでしょう。

悩んでいたのはここでした。
カラムでソートできるようにしたいので、コピーなどはDataGridViewへの書き込みとして処理したほうがすっきりしそうです。

>DataBoundItem
これは初めて知りました。(お恥ずかしい。)
DataGridViewの行にバインドされているDataTableの行オブジェクトを取得ということですが、
DataGridViewへ直接書き込みか、取得したDataTableの行オブジェクトへの書き込みか、どちらが高速なのかを試してみようかと思います。

ありがとうございます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板