asp.netを使用してページャ機能を実装することになった。
しかし、asp.netにはそーゆうことをしてくれるコンポーネントが用意されているという話を聞き、調べてみた。どうもGridViewコントロールというものがそれに該当するらしい。自前で実装するよりも利用した方がラクだろうなと思い、「ASP.NET GridViewコントロール:目次」を参考にちょっとマスタ管理画面を作ってみることにした。
チュートリアルの通り、難なくページング機能を備えた管理画面が出来たが...これはすごい。えーとオレは一体何をやったんだっけ?マウスを数クリックして、DBの対象テーブルを選択しただけだ。ラクってレベルじゃねぇ。こりゃぁ、マジですげぇ!!昔、perlやjavaで自前実装していたあの努力は一体なんだったのか。
としばし感動しつつも、ある問題に気づいた。プロファイラーでDBのクエリーログを漁ってみるとなんと毎回同じクエリーを投げているのだ。表示したいデータの数百倍の量を毎回DBサーバから引っこ抜かれてはちょっと困る。
この問題に関しては以下の記事が役に立った。
・たたかいのきほんはかくとうだぶきやそうびにたよってはいけない by めたるぎあそりっど 08/10/16 大規模データを扱う場合の効率のよいGridViewの表示
・[ASP.NET]GridViewコントロールで大量のデータをページ表示するには?[2.0、3.0、3.5、C#、VB] - @IT
ページング処理に必要な件数取得と実際に表示するデータ取得を分けるのだ。幸いGridViewコントロールもそのような使い方が想定されており、SelectCountMethodやSelectMethodプロパティといった逃げ道が用意されている。実に素晴らしい。
だが、またしても問題が。
GridViewが提供しているPageCountプロパティから全部で何ページあるのか分かるのだが、全部で何件分のデータが入っているのかは引っ張ってこれないようだ。SelectCountMethodを使用して引っ張ってきた値ぐらい公開してくれよと思う。
結局SelectCountMethodの指定を部分クラスのメソッドに置き換え、その中でsession内に一時的に入れておいてPage.PreRenderCompleteイベント時に画面上に出すようして解決。なんかすごく残念なことをやっている気がしてならない。
調べてみたらajaxを使って非同期で切り替える方法もあるみたいだ。ちょっと制約が多いのが気になるが...
GridViewで再読み込みを行わずに表示ページを切り換える(1/2):CodeZine
なーんか調査するものが多くて、最近はなかなか作業がはかどらん。調べれば調べるほどもっといい実装方法があるのではないかと不安になってきてしまう。まいった。