- PR -

Live Demo:DataListにページング機能を追加するには

投稿者投稿内容
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2002-08-27 15:39
View a live demo をクリックすると
DataListにページング機能を付加したサンプルがご覧頂けます。

このサンプルは、DataListに<<, < , >, >>の4種類のナビゲーションボタン
を表示させてページングさせています。

DataGridのページングでは、データベースの先頭(<<), 最終(>>)レコードに
移動する機能がありませんが、このサンプルでは、先頭、最終レコードにも
移動できます。

また、DataGridのページング機能は、カレントページ以外の余分なレコードも
データベースから読み込まれますが、このサンプルではカレントページに
表示されるレコードのみ読み込んで高速化しています。

ページング機能は、DataAdapterのFill()メソッドを使用すれば
簡単に実現することができます。

mySqlDataAdapter.Fill(DataSet, startRecord, maxRecords, srcTable)

ところが、この手法を採用するとカレントページ以外の余分なレコードがテーブル
から読み込まれます。

カレントページに表示するレコードのみ読み込むには、SELECTのTopオプション
を使用します。たとえばページサイズが10レコードのときは、以下のような
SQLを使用します。

次頁に移動するときのSQL:

Select top 10 * From Customers
Where CustomerID > @LastID
Order by CustomerID Asc"


前頁に移動するときのSQL:

Select * From
(Select top 10 * From Customers
Where CustomerID < @FirstID
Order by CustomerID Desc) As Customer1
Order by CustomerID Asc


Happy Programming!
Akio Kasai
Hiro
会議室デビュー日: 2002/03/29
投稿数: 18
投稿日時: 2002-11-07 12:05
こんにちは Hiroです。
いつも勉強させていただいています。

DataListのページング機能について教えてください。
Dr ADO.NETさんのデモのようにDataListのフッダーに
ページング機能を持たせようとしているのですが
デモのようにページの先頭行,最後の行の時
移動ボタンを無効にする方法がわかりません。
DataList内のボタンプロパティの操作はどのように
すればよいのでしょうか
御教示願います。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2002-11-08 10:02
ButtonコントロールのEnabledプロパティにFalseを設定します。

コード:
btnFirst.Enabled=True 
btnPrevious.Enabled=True 
btnNext.Enabled=True 
btnLast.Enabled=True 
If mintCurrentPage = 1 Then 
  btnFirst.Enabled=False 
  btnPrevious.Enabled=False 
ElseIf mintCurrentPage >= mintTotalPages Then 
  btnNext.Enabled=False 
  btnLast.Enabled=False 
End If

<asp:Button id="btnFirst" runat="server"
  Text="<<" ::: />
<asp:Button id="btnPrevious" runat="server"
  Text="<"  ::: />
<asp:Button id="btnNext" runat="server"
  Text=">"  ::: /> 
<asp:Button id="btnLast" runat="server"
  Text=">>" ::: />



Happy Programming!
Akio Kasai
Hiro
会議室デビュー日: 2002/03/29
投稿数: 18
投稿日時: 2002-11-08 16:26
こんにちは Hiroです。
レスありがとうございます。

私の質問の仕方がまずかったのですが、
DBGridのページングのように
DataListのFooterTemplateにID=Button1,Button2という
Buttonコントロールを作成してページングを実現したいです。
DataListの外にページングのボタンを配置すればボタンのプロパティ
は取れますが、DataList内のFooterTemplateに作成されたボタンコントロール
のプロパティを取るにはどのようにすればよいのでしょうか。
御教示お願いします。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2002-11-09 00:03
DataListのFooterTemplateにButtonを配置するときは
DataListのOnItemDataBoundイベントでButtonのEnabledプロパティを
書き換えます。

コード:
If e.Item.ItemType = ListItemType.Footer Then
  CType(e.Item.FindControl("btnFirst"), Button).Enabled = False or True
  :::
End If



Happy Programming!
Akio Kasai
勘助
会議室デビュー日: 2002/11/10
投稿数: 14
投稿日時: 2002-11-12 23:46
こんにちは、Dr ADO.NET。
DataListでのページング処理コーディング例を拝見させていただきました。
ちょっと質問させてください。

まず、今回提示してくださいましたサンプルでは簡単にページング処理が実現できていますが
以下のようなデータ条件の元では実現できるのでしょうか?
***テーブルデータ***
ID 社員名 部ID 部署名
1  Dさん  1  X部署
2  Bさん  1  X部署
3  Cさん  2  Y部署
4  Aさん  3  Z部署
***全社員を取得&社員名でソートして画面表示***
ID 社員名 部ID 部署名
4  Aさん  3  Z部署
2  Bさん  1  X部署
3  Cさん  2  Y部署
1  Dさん  1  X部署
*************************
このようなデータ表現の場合、Dr ADO.NETさんが書かれているSQL条件では
うまくページングが実現できませんよね?
このような場合、1ページあたりの行数を「2」と仮定して、
SQLDataAdapter.Fillで全行返せば勝手にAdapterが指定レコード範囲を返してくれると
思います。
mySqlDataAdapter.Fill(DataSet, 3, 4, srcTable)
3  Cさん  2  Y部署
1  Dさん  1  X部署
しかしこれでは常に全行を引っ張ってしまうので高速化が図れません。
検索&ソート結果をTempテーブルに格納してそのテーブルにはさらにユニークなID列
を作成してそのID列を元にDr ADO.NETさんのSQLで取得は可能となりますが、
果たしてこれが現実的な回答なのでしょうか?
.NETというよりはSQLの世界かもしれませんが、何かよいアドバイスを
頂ければ幸いです。




勘助
会議室デビュー日: 2002/11/10
投稿数: 14
投稿日時: 2002-11-12 23:48
Dr ADO.NETさん。
上記スレッドで「さん」が付いてなく、呼び捨てになっていること
お詫びいたします。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2002-11-13 09:33
DataListに並べ替えとページング機能を組み込むときは、
DataAdapterのFill()メソッドを採用すべきでは?

操作性より性能を優先するなら、DataListをPrimaryKey(主キー)の順に
並べ替えて高速化します。

性能と操作性が要求されるWebサイトを構築するときは、データベースのテーブルを
DataSetに格納してWebサーバのメモリ上にCacheする方法もあります。

DataSetからDataTable/DataViewを作成すれば、並べ替えをメモリ上で行って
DataListにバインドできます。ページがポストバックされたときも、Cacheされた
DataSetを再利用できます。

データベースが更新されたとき、Cacheを自動的に無効にすることも
できます。

Happy Programming!
Akio Kasai

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