- - PR -
DataViewのSort機能
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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 ----------------------------------------------------- 以上です。 もし、何かご指摘・アドバイス等がありましたら どうぞよろしくお願い致します。 |
|
投稿日時: 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-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-18 12:03
お返事ありがとうございます。
DataViewについて誤解していました。 SQLでのorder by句についてですが、 前回、詳しく書かなかったのですが、 SELECTしてきた結果をDataTableに格納し、 さらにそのDataTableに対して手動で行を追加し、 その手動で追加した行とSELECTしてきた行を 混ぜ合わせてソートをかけたかったというわけです。 DataViewをバインドさせる方法も リレーションを張った後の親DataTableをDataViewに移して、 ソートをかけけてみたのですが、 ソートしたい列は子のほうにあるため 「列が見つかりません」となってしまいました。 現在、手動で追加している行もSQLを使用して 一気に取得するようにするぐらいしか 思いつかないのですが、 もし他の方法でできそうなことがありましたら ぜひご教授お願い致します。 |
|
投稿日時: 2004-02-18 13:33
NAL-6295です。
検証していないので、間違っているのかもしれませんが、 DataViewManagerを使うといいかもしれません。 詳しくはヘルプを参照してください。 追記: DataSet内の各テーブルに対してDataViewの設定を行う事ができるので、該当の要件の実装は可能のようですね。 [ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-02-18 13:42 ] |
|
投稿日時: 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-02-18 18:22
あてずっぽうで申し訳ないのですが
'ソートを許可する For Each myDVS In myDVM.DataViewSettings myDVS.ApplyDefaultSort = True Next ApplyDefaultSortは「既定の並べ変えを有効」にするであって「ソートを許可する」 ではないみたいです。もしかするとこれが悪さしているとかないですかね |
|
投稿日時: 2004-02-19 09:33
ご指摘の通り、ソートを許可するわけではなく、
「規定の並び替えを有効にする」でした…。 で、「規定の」というのが何を意味しているのか よく分からなかったのですが、 falseにして同じことをやってみました。 でも、やはりソートは有効になりませんでした。 現在は、手動で行を追加するときに、 行番号を指定して希望の位置に挿入することで回避しています。 また何かありましたらご教授願います。 |