- PR -

DataTableとDataViewの行インデックスについて

投稿者投稿内容
SNMODU
会議室デビュー日: 2007/11/26
投稿数: 6
投稿日時: 2007-11-26 13:57
DataViewでRowFilterをセットしたデータの行インデックスが、
DataTableのどの行インデックスにあたるか、
また、逆にDataTableの行インデックスからDataViewのどの行インデックス
あたるかを知りたいと思います。
取得方法をご存知の方がいらっしゃいましたらご教示ください。
よろしくお願いします。

[ メッセージ編集済み 編集者: SNMODU 編集日時 2007-11-26 13:58 ]
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-11-27 09:22
引用:

SNMODUさんの書き込み (2007-11-26 13:57) より:

DataViewでRowFilterをセットしたデータの行インデックスが、
DataTableのどの行インデックスにあたるか、


DataTable.Find(object[] key)

引用:

また、逆にDataTableの行インデックスからDataViewのどの行インデックス
あたるかを知りたいと思います。


DataView.Find(object[] key)

前者については、自動採番を行うダミー列をDataTableに追加し、ダミー列の値 = 行番号となるようにすると、もっと楽できるかもしれない。
途中に行を追加されたり、ソート順を変更されると破綻するけど。
SNMODU
会議室デビュー日: 2007/11/26
投稿数: 6
投稿日時: 2007-11-27 10:26
かずくんさんレスありがとうございます。

Findメソッドについては、まったく同一のデータが存在する場合があるため残念ながら使用できないのです。
ダミー列については、かずさんのおっしゃられている通りに、最悪そのようにするするしかないかなと考えておりました。
DBはORACLEなのですが、データテーブルには、SELECT発行されたデータが格納されます。
SELECTにROWNUMを付加して行番号を付加し、行が新たに追加された場合は、行数+1で行番号をセットしようかと思っています。
ただ、すべてのSELECT文にROWNUMを追加するのはあまりスマートではないような気がしているところです。

DataTableとDataViewに紐づきがあるのではないかと思い、用意されているメッソドやプロパティで解決できるのかと調べましたが、いまだに不明です。そろそろ、妥協しようかと思っています。。。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-11-27 12:32
引用:

SNMODUさんの書き込み (2007-11-27 10:26) より:

Findメソッドについては、まったく同一のデータが存在する場合があるため残念ながら使用できないのです。


主キーを並べ替えキーとして、DataView.Findを呼べば、重複なく取れそうな気がするけど、だめかねぇ?

引用:

ダミー列については、かずさんのおっしゃられている通りに、最悪そのようにするするしかないかなと考えておりました。
DBはORACLEなのですが、データテーブルには、SELECT発行されたデータが格納されます。
SELECTにROWNUMを付加して行番号を付加し、行が新たに追加された場合は、行数+1で行番号をセットしようかと思っています。
ただ、すべてのSELECT文にROWNUMを追加するのはあまりスマートではないような気がしているところです。


ADO.netの自動採番を使用してみては?
たぶんDataTable.AutoIncrement
SNMODU
会議室デビュー日: 2007/11/26
投稿数: 6
投稿日時: 2007-11-27 14:31
引用:
かずくんさんの書き込み(2007-11-27 12:32)より:
主キーを並べ替えキーとして、DataView.Findを呼べば、重複なく取れそうな気がするけど、だめかねぇ?


主キーが設定できないデータなので使用できないのです。

引用:

ADO.netの自動採番を使用してみては?
たぶんDataTable.AutoIncrement


ちょうど自動採番するものを探していました。
早速、試してみたところ、
DataTable.Columns.AutoIncrementで自動採番し行番号を付加することができました。
この行番号でDataTableとDataViewの紐付けを行いたいと思います。

はじめての書き込みだったのでドキドキしてしまいました。
かずくんさん。ご親切に教えていただきありがとうございました。


[ メッセージ編集済み 編集者: SNMODU 編集日時 2007-11-27 14:33 ]
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-11-27 15:15
引用:

SNMODUさんの書き込み (2007-11-26 13:57) より:

DataViewでRowFilterをセットしたデータの行インデックスが、
DataTableのどの行インデックスにあたるか、


だけであれば、DataRowView.Row プロパティが使えるかな?と思いましたが

引用:

また、逆にDataTableの行インデックスからDataViewのどの行インデックス
あたるかを知りたいと思います。


となると、やはりかずくんが書かれているような自動採番を使うのが一番手っ取り早い
かもしれないですね。
# 自分ではあまり DataRow から DataRowView を得ることはしませんが
# (そのときはまた別途 DataView を作るかも)
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-11-27 16:19
引用:

ぽぴ王子さんの書き込み (2007-11-27 15:15) より:
引用:

SNMODUさんの書き込み (2007-11-26 13:57) より:

DataViewでRowFilterをセットしたデータの行インデックスが、
DataTableのどの行インデックスにあたるか、


だけであれば、DataRowView.Row プロパティが使えるかな?と思いましたが


以下のようなコード(イメージ)になるのでしょうか?
コード:
DataTable.Rows.IndexOf(DatRowView.Row)



引用:

# 自分ではあまり DataRow から DataRowView を得ることはしませんが


これって、できますか?
もしできるのなら、
コード:
((IList)DataView).IndexOf(DataRow から変換した DataRowView)


で、取り出せるのかな?
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-11-27 16:53
引用:

かずくんさんの書き込み (2007-11-27 16:19) より:

以下のようなコード(イメージ)になるのでしょうか?
コード:

DataTable.Rows.IndexOf(DataRowView.Row)




そうですね。そんな感じです。
…っと書いて、行そのものではなく行インデックスが欲しいのだと言うことに
今頃気がつきました。とほほ。

流れから言って、PrimaryKey を設定することができないデータで、全く同じ
データが存在するので(だから設定できない?)そこから作った DataView が
どの行を指しているか(行そのものではなくインデックス)を知りたいという
話であった、と。
となるとやっぱり DataColumn.AutoIncrement が有用ですね。
なんか使えないツッコミをしてしまったような希ガス。反省。

引用:

これって、できますか?
もしできるのなら、
コード:

((IList)DataView).IndexOf(DataRow から変換した DataRowView)


で、取り出せるのかな?


んー。DataRow から DataRowView に変換することができなさそう。
別途 DataView を元テーブルから作ったとしても、それはそれで別の DataRowView
になるので、IndexOf では見つからないわけですし。

ところで言語は C# で良かったんでしたっけ。何も書かれてなかったですけど。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。

スキルアップ/キャリアアップ(JOB@IT)