- PR -

[DataView] ソートや抽出を行った後に、データ変更

1
投稿者投稿内容
うきょきょ
常連さん
会議室デビュー日: 2004/01/09
投稿数: 44
投稿日時: 2006-03-23 15:05
キー等を設定しないで、DataViewにデータが格納されている状態で、
ソートや抽出を行った行を対象に、修正を行いたいのですが、
DataView.ToTableは、元のDataView.Tableのコピーらしく
元のデータは変わりませんでした。

コード:
・オリジナル(DataView.Table)
 |abc|def|ghi|
-+---+---+---+
1|123|aaa|bbb|
2|999|xyz|xyz|
3|123|ccc|ddd|
4|125|vvv|yyy|
5|888|mmm|sss|

・abcでソート(Sort)(DataView.ToTable)
 |abc|def|ghi|
-+---+---+---+
1|123|aaa|bbb|
2|123|ccc|ddd|
3|125|vvv|yyy|
4|888|mmm|sss|
5|999|xyz|xyz|

・abc<200で抽出(RowFilter)(DataView.ToTable)
 |abc|def|ghi|
-+---+---+---+
1|123|aaa|bbb|
2|123|ccc|ddd|
3|125|vvv|yyy|



上記状態で2行目のdefを変更したい場合、実際はDataView.Tableの3行目を
変更して後に、DataView.ToTableを読み直せばいいのですが、
最後のDataView.ToTable.Rows(2) ≠ DataView.Table.Rows(3)のため、
FindRowメソッドやDataView.ToTable.Rows(2).Equals(DataView.Table.Rows(3))
等も期待通りになりません。
期待通りになるにはどうしたらよいでしょうか?
なおこ(・∀・)
大ベテラン
会議室デビュー日: 2004/04/08
投稿数: 174
お住まい・勤務地: 東京都
投稿日時: 2006-03-27 11:11
お世話になります。

DataView.ToTable() だと、
最初の・オリジナル(DataView.Table)
とは異なるオブジェクトとして扱われるので、
結果が変わってしまうのは当然かもしれませんね。

もとの DataTable オブジェクトは全部同じにして、
DataView オブジェクトを以下の 2 つ用に作ってやってはいかがでしょう。
・abcでソート(Sort)
・abc<200で抽出
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-27 12:06
引用:

うきょきょさんの書き込み (2006-03-23 15:05) より:

キー等を設定しないで、DataViewにデータが格納されている状態で、
ソートや抽出を行った行を対象に、修正を行いたいのですが、
DataView.ToTableは、元のDataView.Tableのコピーらしく元のデータは変わりませんでした。


この文章を見ると、「原因」も「最適解」もご存知のように思えるのですが。(;^-^)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
うきょきょ
常連さん
会議室デビュー日: 2004/01/09
投稿数: 44
投稿日時: 2006-03-27 13:20
レスありがとうございます。
昼までにレスなければ、書き方を変えようかと思ってました^^;

To:なおこ(・∀・)さん
引用:

もとの DataTable オブジェクトは全部同じにして、
DataView オブジェクトを以下の 2 つ用に作ってやってはいかがでしょう。
・abcでソート(Sort)
・abc<200で抽出


DataViewを2つ作成してソートや抽出する時に、元のDataTableオプジェクトのIndexを、
用意することも考えたのですがこの場合自分でコピーし、さらにコピー後のDataViewに
オリジナルには無いフィールドを作成して、元とのIndexを用意するという処理が必要になる気がして、処理に時間がかかるなと危惧しています。
#最終的にそれしかないのなら仕方ないのですが・・・

TO:じゃんぬねっとさん
引用:

この文章を見ると、「原因」も「最適解」もご存知のように思えるのですが。(;^-^)


DataViewのToTable以下のDataRowに、値を設定してもデータが変わらなかったので、
MSDN(今はDocumentExplorer?)を調べたので「原因」はわかっていますが、
「最適解」がどうもわからなくて、お知恵を拝借したいと(^^;

やっぱ変更したいDataTableに対するIndexを別に用意すべきなんでしょうか・・・
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-27 13:24
引用:

うきょきょさんの書き込み (2006-03-27 13:20) より:

DataViewのToTable以下のDataRowに、値を設定してもデータが変わらなかったので、
MSDN(今はDocumentExplorer?)を調べたので「原因」はわかっていますが、
「最適解」がどうもわからなくて、お知恵を拝借したいと(^^;
やっぱ変更したいDataTableに対するIndexを別に用意すべきなんでしょうか・・・


状況をちょっと勘違いしているかもしれませんが、私はそれが最適解だと思っていました。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
なおこ(・∀・)
大ベテラン
会議室デビュー日: 2004/04/08
投稿数: 174
お住まい・勤務地: 東京都
投稿日時: 2006-03-27 15:07
お世話になります。

引用:

DataViewを2つ作成してソートや抽出する時に、元のDataTableオプジェクトのIndexを、
用意することも考えたのですがこの場合自分でコピーし、さらにコピー後のDataViewに
オリジナルには無いフィールドを作成して、元とのIndexを用意するという処理が必要になる気がして、処理に時間がかかるなと危惧しています。
#最終的にそれしかないのなら仕方ないのですが・・・


勘違いしてたらすみませんが、
下のようなコードで実験して、
2 番目の DataGrid の行の値「8さん」を「Eightさん」に変更して
行を変更したら、上の grid も「Eightさん」になりました。
Index は必要なんでしょうか...? (あった方が解りやすいとは思いますが)
コード:
Dim dt As DataTable = New DataTable("test001")
dt.Columns.Add("person_id", GetType(Integer))
dt.Columns.Add("person_name", GetType(String))
dt.Columns(0).DataType = GetType(String)
For i As Integer = 0 To 10
  dt.Rows.Add(New Object() {i, i.ToString() + "さん"})
Next

Me.DataGrid3.DataSource = New DataView(dt)

Dim dvFor4 As DataView = New DataView(dt)
dvFor4.Sort = "person_id DESC"
Me.DataGrid4.DataSource = dvFor4

Dim dvFor5 As DataView = New DataView(dt)
dvFor5.RowFilter = "person_id < 9"
Me.DataGrid5.DataSource = dvFor5

うきょきょ
常連さん
会議室デビュー日: 2004/01/09
投稿数: 44
投稿日時: 2006-03-28 10:22
検証コードありがとうございます。
急な出張なため、後日ためさせていただきます。

取り急ぎ返信だけ・・・
うきょきょ
常連さん
会議室デビュー日: 2004/01/09
投稿数: 44
投稿日時: 2006-04-07 09:24
To:なおこ(・∀・)さん、じゃんぬねっとさん

遅くなりました。

WinFormでやった時に検証コードが確かに動きました。
ただWebForm(DataSetがViewState格納時)は、うまく行きませんでした。

原因を調べてる暇がちょっとないので、Indexを使用した方法で行おうと思います。
ありがとうございました。
1

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