- PR -

[ASP.NET]GridViewで行選択の際に、一覧データの再描画を防ぎたい

投稿者投稿内容
キレネン
会議室デビュー日: 2008/08/04
投稿数: 9
投稿日時: 2008-10-28 22:49
いつもお世話になっております。

GridViewのプロパティでAutoGenerateSelectButtonをtrueにすると
GridViewに「選択」セルが出現して、行の選択が可能になります。

しかし、GridViewにデータ数百件や数千件とか表示させてから
行の選択を行うと、行の色が変化するまで凄くモッサリします。
これは、毎回毎回ポストバックが発生してGridViewのデータ取り直しから
再描画までやり直してしまうせいかと思います。

そこで、GridViewのデータ取り直しや再描画はしないで
単純に行の色だけ変えたいんですが、簡単に出来ませんでしょうか。
ちなみに、現在選択されているのが何行目であるかの情報を、行選択の都度
サーバに伝える必要もあります。
ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2008-10-29 00:25
簡単に出来ます。


追加:
が、数千件を一度に表示したいという仕様自体を見直すべきです。

[ メッセージ編集済み 編集者: ぴあちゃん 編集日時 2008-10-29 00:27 ]
かつひと
常連さん
会議室デビュー日: 2006/06/01
投稿数: 32
投稿日時: 2008-10-29 09:13
 ぴあちゃんさんに同感です。

・そもそも一度に数千件も表示する必要があるのか。
  (そんなに一度に表示されても、データを目で追って探すのが大変)
・パフォーマンスが大幅に落ちる。
・サーバに大きな負荷をかける。

 キレネンさんの顧客から「一度に全件表示してほしい」という要求が出ているのかもしれませんが、そんな必要はないことが多いです笑(あくまでこれまでの経験ですが)

 自分も失敗したことがありますが、一度に数百、数千件表示させると大抵、パフォーマンスが大幅に落ちたり、DBサーバに大きな負荷がかかったりします。

 また、稼動当初は問題なくても、早ければ稼動後2、3ヶ月経ってデータが溜まってきた頃に問題が発覚します(ご存知かもしれませんが、これは重要です!!)。
不特定多数のアクセスがあるWebアプリだとすると特に深刻で、最悪DBサーバがダウンします。

 ASP.NETに限りませんが、一般的にはページング処理をしたり、検索機能を付けたり(さらには無条件検索をできなくしたり)という対処をするのが良いのではないでしょうか。
冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2008-10-29 09:25
最近、つくづく思うのは、webアプリだと特に見せ方が重要になってくるんですな。

そこまで考えられるようになるには、まず前提となる基本技術を使いこなせている事が重要になってきます。

# ヨーシ。夜間バッチでCSV作っちゃって後はエクセルで見てね!ってしちゃうぞー、とか。
# でも、CSVで数千件程度なら、まだ、直接出力でも大丈夫かな?
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-10-29 10:00
どうしても数千件を一度に処理したい、なんて要件もありますよ。
もっともその場合はWebアプリでなく、クライアント/サーバ型にしたほうがいいと思いますが。
キレネン
会議室デビュー日: 2008/08/04
投稿数: 9
投稿日時: 2008-10-29 22:29
皆様返答ありがとうございます。
あまり詳しくは書けないですが、webアプリは商用では無いんです。
(とは言え、仕様や時間や色々と制約が有りますが・・・)
実際のデータ数は数千行もいかない予定ですが、今の所100行程度表示しただけでもかなり遅いので改善せねばと調査している所です。尚、ページング処理は仕様として却下されました。

現在は行選択処理を以下のサイトにある方法で実装しています。
Shizuku Blog 〜 techbank.jp版〜
[ASP.NET] : (今回はVB専用): GridView&選択ボタンなしで、行を選択する方法
http://techbank.jp/Community/blogs/mymio/archive/2008/04/14/534.aspx

この方法だとJavaScriptの処理で「__doPostBack」を行っている為、
強制的にGridViewが再描画されてしまう=データの再読み込みとGridViewの
作り直しが発生してしまうと思います。
今のところ、ボトルネックの一つとしてデータの再読み込み箇所が重いので、行をクリックした時にはサーバからデータの再読み込みを行わないようにして今表示しているデータをそのまま再描画するようにしたところパフォーマンスが少し上がりました。
でも、そもそもポストバックさえしないで行の色だけを変更出来れば
パフォーマンスは格段に上がるのにと思いつつ、どう実装すれば良いか検討付きません。
(JavaScriptサッパリ分かりません・・・)
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2008-10-30 10:02
> 今のところ、ボトルネックの一つとしてデータの再読み込み箇所が重いので、
> 行をクリックした時にはサーバからデータの再読み込みを行わないようにして
> 今表示しているデータをそのまま再描画するようにしたところパフォーマンスが
> 少し上がりました。

あれ?
普通にGridView使って選択ボタンで処理しているなら再読み込みは元々しなかったと
思いますが。
ViewState切ってるのかな?
でも、それだと再読み込みしないでデータを表示、ができないような気がするしな。

なんか、素直な実装しないでいろんなことやってません?
その場合、各種のボトルネックをまず調査したほうがよいかと。

> (JavaScriptサッパリ分かりません・・・)

どうしてもやる必要がある、ということならわかりませんとかいってないで調べましょう。
それしか方法ないでしょうし。

キレネン
会議室デビュー日: 2008/08/04
投稿数: 9
投稿日時: 2008-10-30 23:42
どっとねっとふぁん様

情けない事に、「素直な実装」がどういう物かすら良く分かってないんです。
例えばGridViewの行選択方法も、「素直な実装」であれば選択ボタンを表示するという
方法になるでしょうか。しかしそれでは見た目が悪いという事で
先述のサイトを参考に見よう見まねで、どのセルをクリックしても
行選択が出来るように実装したりしています。

初めてのwebアプリでここ1〜2ヶ月は試行錯誤の連続です。
ポストバックとかセッション変数だとか、スタティック変数はプリコンパイルするまで
ずっと値が変わらないとか、とにかくWindowsアプリの世界とは違う常識がいっぱいで、
毎日が勉強です。(けど期限は容赦無く迫ってくる、みたいなw)
行選択処理も、てっきりGridViewの機能として普通にあるだろうとタカを括っていたら
随分面倒で驚きました。。。

>どうしてもやる必要がある、ということならわかりませんとかいってないで調べましょう。
>それしか方法ないでしょうし。

仰る通りです。JavaScriptの勉強を頑張ります。

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