- PR -

DataViewのSort機能

投稿者投稿内容
さくら
ベテラン
会議室デビュー日: 2004/02/12
投稿数: 76
投稿日時: 2004-02-18 11:22
現在、Windos2000+ASP.NET+IE6.0の環境で
WEBアプリを作成しています。

1.OracleからSELECTしてきたデータをDataTableに格納する
2.そのDataTableをDataViewに移す
3.DataViewをソートする
4.ソートされたDataViewを新しいDataTableに入れ直す
5.そのDataTableと別のDataTableでリレーションを作成する
6.親DataTableをUltraWebGrid(グリッドツール)にバインドする
という処理をしたいのですが、
ソートが機能していないのか、その後のDataTableに
入れ直すなどの処理が影響しているのかは分かりませんが、
DataViewのソートが働いていません。
グリッドには親子階層が正しく表示されているため
5番以降のソースに問題はないと思います。

1番は省略して、2番から4番までのソースは、
-----------------------------------------------------
Dim TestView As New DataView()
Dim TestTable As New DataTable()
Dim TestSet As New DataSet()

TestView = TestSet.Tables("TEST").DefaultView
TestView.Sort = "PAGE_NO ASC"
TestTable = TestView.Table
-----------------------------------------------------
以上です。

もし、何かご指摘・アドバイス等がありましたら
どうぞよろしくお願い致します。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-02-18 11:32
NAL-6295です。

そもそも、DataViewというものを勘違いされているようです。
DataViewは言ってみれば「視点」です。
DataViewは対象のDataTableをいろんな「視点」で見るためのツールです。
つまりDataViewでソートした結果DataTableの内容が変わるわけではなく、DataViewからの「見え方が変わる」だけでしかありません。
その為、DataTableに入れなおしたとしても、ソートが反映されるわけではないのです。

#DataView.Tableは元のDataTableを参照しているだけにすぎません。

では、どうしたらソートされるのか。

一番簡単なのはSQLのOrder by句で指定することです。
又は、グリッドに対してDataTableではなくDataViewをバインドするのもいいかもしれません。
その他、いろいろ考えてみて下さい。

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-02-18 11:35 ]
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-02-18 11:37
DataViewのTableプロパティにはソートされた結果ではなくソースとなったテーブルの情報が
格納されていますので

TestView = TestSet.Tables("TEST").DefaultView
TestView.Sort = "PAGE_NO ASC"
TestTable = TestView.Table

この場合TestTableにはTestSet.Tables("TEST")が格納されますので
当然ソートはされてません(ソートされているのはViewなので)

今回の場合は
1.OracleからSELECTしてきたデータをDataTableに格納する
2.そのDataTableと別のDataTableでリレーションを作成する
3.親テーブルをソースにをDataViewを作成
4.DataViewをソートする
5.ソートされたDataViewをUltraWebGrid(グリッドツール)にバインドする

で実現できると思います

(追加)
おもっきりかぶってしまいました。
さらにNAL-6295さんのほうがきちんと説明しているし・・・



[ メッセージ編集済み 編集者: ゆうじゅん 編集日時 2004-02-18 11:40 ]
さくら
ベテラン
会議室デビュー日: 2004/02/12
投稿数: 76
投稿日時: 2004-02-18 12:03
お返事ありがとうございます。
DataViewについて誤解していました。

SQLでのorder by句についてですが、
前回、詳しく書かなかったのですが、
SELECTしてきた結果をDataTableに格納し、
さらにそのDataTableに対して手動で行を追加し、
その手動で追加した行とSELECTしてきた行を
混ぜ合わせてソートをかけたかったというわけです。

DataViewをバインドさせる方法も
リレーションを張った後の親DataTableをDataViewに移して、
ソートをかけけてみたのですが、
ソートしたい列は子のほうにあるため
「列が見つかりません」となってしまいました。

現在、手動で追加している行もSQLを使用して
一気に取得するようにするぐらいしか
思いつかないのですが、
もし他の方法でできそうなことがありましたら
ぜひご教授お願い致します。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-02-18 13:33
NAL-6295です。

検証していないので、間違っているのかもしれませんが、
DataViewManagerを使うといいかもしれません。
詳しくはヘルプを参照してください。

追記:
DataSet内の各テーブルに対してDataViewの設定を行う事ができるので、該当の要件の実装は可能のようですね。

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-02-18 13:42 ]
さくら
ベテラン
会議室デビュー日: 2004/02/12
投稿数: 76
投稿日時: 2004-02-18 17:29
お返事ありがとうございます。

早速、DataViewManagerで試してみました。
-------------------------------------------------------------------
'リレーションを張ったDataSet「TestSet」を設定する
Dim myDVM As DataViewManager = New DataViewManager(TestSet)
Dim myDVS As DataViewSetting

'ソートを許可する
For Each myDVS In myDVM.DataViewSettings
myDVS.ApplyDefaultSort = True
Next

'子DataTable「TestChild」の列「PAGE_NO」を昇順にソートするが、
'親DataTable「TestParent」ですでにリレーションを張っているため
'親DataTableを指定してソートを行う。※エラー発生せず
myDVM.DataViewSettings("TestParent").Sort = "PAGE_NO ASC"

'グリッドのバインドソースに親DataTable「TestParent」を設定する
'※myGrid.DataSource = myDVM では3階層になる(疑問点)
'※myGrid.DataSource = myDVM.DataViewSettings("TestParent").Table
' は下記と同じ結果となる
myGrid.DataSource = myDVM.DataSet.Tables("TestParent")

myGrid.DataBind()
-------------------------------------------------------------------
と書いて実行した結果、エラーは出なくなり、
親子関係も正しく表示されましたが、
やはりソートされませんでした…。
ヘルプの例も、親DataTableの列をソートしているので
ひょっとして子DataTable列のソートはできないのでは!?
という懸念が浮かんでいます。

また他に何かありましたらご教授お願い致します。

(追記)
ソートしてる箇所を、親DataTableではなく、
myDVM.DataViewSettings("TestChild").Sort = "PAGE_NO ASC"
と子DataTableに変えても結果は同じく、ソートされませんでした。
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-02-18 18:22
あてずっぽうで申し訳ないのですが

'ソートを許可する
For Each myDVS In myDVM.DataViewSettings
myDVS.ApplyDefaultSort = True
Next

ApplyDefaultSortは「既定の並べ変えを有効」にするであって「ソートを許可する」
ではないみたいです。もしかするとこれが悪さしているとかないですかね
さくら
ベテラン
会議室デビュー日: 2004/02/12
投稿数: 76
投稿日時: 2004-02-19 09:33
ご指摘の通り、ソートを許可するわけではなく、
「規定の並び替えを有効にする」でした…。

で、「規定の」というのが何を意味しているのか
よく分からなかったのですが、
falseにして同じことをやってみました。
でも、やはりソートは有効になりませんでした。

現在は、手動で行を追加するときに、
行番号を指定して希望の位置に挿入することで回避しています。

また何かありましたらご教授願います。

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