まずテーブルを作成します (ID の自動番号付けが必要です)。
テーブルを作成します redheadedfile(
id int アイデンティティ(1,1)、
ファイル名 nvarchar(20)、
senduser nvarchar(20)、
主キー(ID)
)
次に、500,000 レコードを書き込みます。
@i int を宣言する
@i=1 を設定します
while @i<=500000
始める
redheadedfile(filenames,senduser) に挿入 value('マイ ページング アルゴリズム','Lu Junming')
@i=@i+1 を設定します
終わり
行く
Microsoft Visual Studio .NET 2003 を使用して WebForm Web ページを作成します (webform8.aspx という名前を付けました)。
フロントエンドのコード スニペットは次のとおりです (webform8.aspx)。
<%@ Page language="c#" Codebehind="WebForm8.aspx.cs" AutoEventWireup="false" Inherits="WebApplication6.WebForm8" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<頭>
<title>WebForm8</title>
<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
<meta content="C#" name="CODE_LANGUAGE">
<meta content="JavaScript" name="vs_defaultClientScript">
<meta content=" http://schemas.microsoft.com/intellisense/ie5 " name="vs_targetSchema">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" Method="post" runat="server">
<asp:datalist id="datalist1" AlternatingItemStyle-BackColor="#f3f3f3" width="100%" CellSpacing="0"
CellPadding="0" Runat="サーバー">
<アイテムテンプレート>
<table width="100%" border="0" cellpacing="0" cellpadding="0">
<tr>
<td width="30%"
align="center"><%#DataBinder.Eval(Container.DataItem,"filenames")%></td>
<td width="30%"
align="center"><%#DataBinder.Eval(Container.DataItem,"senduser")%></td>
<td width="30%"
align="center"><%#DataBinder.Eval(Container.DataItem,"id")%></td>
</tr>
</テーブル>
</ItemTemplate>
</asp:datalist>
<div align="center">合計<asp:label id="LPageCount" Runat="server" ForeColor="#ff0000"></asp:label>ページ/合計
<asp:label id="LRecordCount" Runat= "server" ForeColor="#ff0000"></asp:label>レコード
<asp:linkbutton id="Fistpage" Runat="server"
CommandName="0">ホーム</asp:linkbutton> <asp:linkbutton id="Prevpage" Runat="server" CommandName ="prev">
前のページ</asp:linkbutton> <asp:linkbutton id="Nextpage" Runat="server"
CommandName="next">次のページ</asp:linkbutton >  ; <asp:linkbutton id="Lastpage" Runat="server"
CommandName="last">最後のページ</asp:linkbutton> 現在のページ<asp: label id ="LCurrentPage" Runat="server"
ForeColor="#ff0000"></asp:label>ページ ジャンプ ページ<asp:TextBox ID="gotoPage" Runat="server" width ="30px "
MaxLength="5" AutoPostBack="True"></asp:TextBox></div>
</form>
</body>
</HTML>
バックグラウンド コード スニペットは次のとおりです (webform8.aspx.cs)
システムを使用する;
System.Collections を使用します。
System.ComponentModel を使用します。
System.Data を使用します。
System.Drawing を使用します。
System.Web を使用します。
System.Web.SessionState を使用します。
System.Web.UI を使用します。
System.Web.UI.WebControls を使用します。
System.Web.UI.HtmlControls を使用します。
System.Data.SqlClient を使用します。
System.Configuration
名前空間 WebApplication6
を使用します。
{
/// <概要>
/// WebForm8 の概要説明。
/// </概要>
パブリック クラス WebForm8 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.LinkButton 最初のページ;
protected System.Web.UI.WebControls.LinkButton 前のページ;
protected System.Web.UI.WebControls.LinkButton Nextpage;
protected System.Web.UI.WebControls.LinkButton Lastpage;
protected System.Web.UI.WebControls.DataList データリスト 1;
protected System.Web.UI.WebControls.DropDownList mydroplist;
protected System.Web.UI.WebControls.Label LPageCount;
protected System.Web.UI.WebControls.Label LRecordCount;
protected System.Web.UI.WebControls.Label LCurrentPage;
保護された System.Web.UI.WebControls.TextBox gotoPage;
const int PageSize=20; //各ページに表示するレコードを定義します。
int PageCount,RecCount,CurrentPage,Pages,JumpPage;//ページングパラメータを保存するためにいくつかの変数を定義します
private void Page_Load(オブジェクト送信者、System.EventArgs e)
{
if(!IsPostBack)
{
RecCount = Calc();//Calc() 関数を通じてレコードの総数を取得します
PageCount = RecCount/PageSize + OverPage();//合計ページ数を計算します (残りが
不完全な表示データを引き起こすのを防ぐために OverPage() 関数を加えます)
ViewState["PageCounts"] = RecCount/PageSize -
ModPage();/ /Save Total ページ パラメーターを ViewState に保存します (SQL ステートメントの実行時にクエリ範囲がオーバーフローするのを防ぐための ModPage() 関数は除きます。ストアド プロシージャのページング アルゴリズムを使用すると、この文を理解できます)
ViewState["PageIndex"] = 0;//ページ インデックス値 0 を ViewState に保存します
ViewState["JumpPages"] = PageCount;//PageCount を ViewState に保存し、ジャンプ時にユーザー入力番号が
ページ番号の
範囲を超えているかどうかを判断します。
//LPageCountとLRecordCountのステータスを表示する
LPageCount.Text = PageCount.ToString();
LRecordCount.Text = RecCount.ToString();
//ページジャンプテキストボックスが無効かどうかを判定する
if(RecCount <= 20)
gotoPage.Enabled = false;
TDataBind();//データ バインディング関数 TDataBind() を呼び出してデータ バインディング操作を実行します
}
}
//残りのページを計算する
public int OverPage()
{
int ページ = 0;
if(RecCount%PageSize != 0)
ページ = 1;
それ以外
ページ = 0;
ページを返す。
}
// SQL ステートメントの実行時にクエリ範囲がオーバーフローしないように、残りのページを計算します。
public int ModPage()
{
int ページ = 0;
if(RecCount%PageSize == 0 && RecCount != 0)
ページ = 1;
それ以外
ページ = 0;
ページを返す。
}
/*
*合計レコードを計算する静的関数
*ここで静的関数を使用する理由は、静的データまたは静的関数が参照される場合、コネクタは生成されたコードを最適化し、動的再配置項目を削除するためです (
大規模なデータ テーブルのページング効果がより明らかです)。
※ご意見、間違いがあれば修正していただければ幸いです。
*/
パブリック静的 int Calc()
{
int RecordCount = 0;
SqlCommand MyCmd = new SqlCommand("select count(*) as co from redheadedfile",MyCon());
SqlDataReader dr = MyCmd.ExecuteReader();
if(dr.Read())
RecordCount = Int32.Parse(dr["co"].ToString());
MyCmd.Connection.Close();
RecordCount を返します。
}
//データベース接続ステートメント (Web.Config から取得)
パブリック静的 SqlConnection MyCon()
{
SqlConnection MyConnection = new SqlConnection(ConfigurationSettings.AppSettings["DSN"]);
MyConnection.Open();
MyConnection を返します。
}
// 4 つのボタン (ホームページ、前ページ、次ページ、最後のページ) によって返される CommandName 値を操作します。
private void Page_OnClick(オブジェクト送信者、CommandEventArgs e)
{
CurrentPage = (int)ViewState["PageIndex"];//ViewState からページ番号の値を読み取り、パラメーター
計算
のために CurrentPage 変数に保存します。
Pages = (int)ViewState["PageCounts"];//ViewState から合計ページ パラメーター操作文字列を読み取ります
cmd = e.CommandName;
switch(cmd)//フィルターコマンド名
{
「次」の場合:
現在のページ++;
壊す;
ケース「前」:
現在のページ--;
壊す;
「最後」の場合:
現在のページ = ページ;
壊す;
デフォルト:
現在のページ = 0;
壊す;
}
ViewState["PageIndex"] = CurrentPage;//計算された CurrentPage 変数を ViewState に再度保存します
TDataBind();//データ バインディング関数 TDataBind() を呼び出します
プライベート
void TDataBind()
{
CurrentPage = (int)ViewState["PageIndex"];//ViewState からページ番号の値を読み取り、ボタン
無効化
操作のために CurrentPage 変数に保存します。
Pages = (int)ViewState["PageCounts"];//ViewState から合計ページ パラメータを読み取り、ボタン無効化の計算を実行します
// 4 つのボタン (ホームページ、前ページ、次ページ、最後のページ) のステータスを決定します。
if (現在のページ + 1 > 1)
{
Fistpage.Enabled = true;
Prevpage.Enabled = true;
}
それ以外
{
Fistpage.Enabled = false;
Prevpage.Enabled = false;
}
if (現在のページ == ページ)
{
Nextpage.Enabled = false;
Lastpage.Enabled = false;
}
それ以外
{
Nextpage.Enabled = true;
Lastpage.Enabled = true;
}
//DataList コントロールへのデータ バインディング
DataSet ds = 新しい DataSet();
//コア SQL ステートメント、クエリ操作を実行します (ページングの効率を決定します:))
SqlDataAdapter MyAdapter = new SqlDataAdapter("Select Top "+PageSize+" * from redheadedfile where id
not in(select top "+PageSize*CurrentPage+" id from redheadedfile order by id asc) order by id asc",MyCon());
MyAdapter.Fill(ds,"ニュース");
datalist1.DataSource = ds.Tables["ニュース"].DefaultView;
datalist1.DataBind();
//ラベル コントロール LCurrentPaget とテキスト ボックス コントロール gotoPage ステータスを表示します
LCurrentPage.Text = (CurrentPage+1).ToString();
gotoPage.Text = (CurrentPage+1).ToString();
//SqlDataAdapterを解放する
MyAdapter.Dispose();
#region
Web フォーム デザイナーによって生成されたコード
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: この呼び出しは、ASP.NET Web フォーム デザイナーに必要です。
//
InitializeComponent();
Base.OnInit(e);
}
/// <概要>
/// デザイナーは必要なメソッドをサポートしています - 変更にはコード エディターを使用しないでください
/// このメソッドの内容。
/// </概要>
private void InitializeComponent()
{
this.Fistpage.Command += new System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);
this.Prevpage.Command += new System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);
this.Nextpage.Command += new System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);
this.Lastpage.Command += new System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);
this.gotoPage.TextChanged += new System.EventHandler(this.gotoPage_TextChanged);
this.Load += 新しい System.EventHandler(this.Page_Load)
;
#エンドリージョン
//ジャンプページコード
private void gotoPage_TextChanged(オブジェクト送信者、System.EventArgs e)
{
試す
{
JumpPage = (int)ViewState["JumpPages"];//ViewState から利用可能なページ値を読み取り、JumpPage 変数に保存します
//ユーザー入力値が使用可能なページ範囲値を超えているかどうかを判断します
if(Int32.Parse(gotoPage.Text) > JumpPage || Int32.Parse(gotoPage.Text) <= 0)
Response.Write("<script>alert('ページ範囲が範囲外です!');location.href='WebForm8.aspx'</script>");
それ以外
{
int InputPage = Int32.Parse(gotoPage.Text.ToString()) - 1;//ユーザー入力値を変換し、int 型の
InputPage 変数
に保存します
ViewState["PageIndex"] = InputPage;//InputPage の値を ViewState["PageIndex"] に書き込みます
TDataBind();//データ バインディング関数 TDataBind() を呼び出して、データ バインディング操作を再度実行します
}
}
//ユーザーが間違ったデータ型を入力したことによって発生する例外をキャッチします
catch(例外exp)
{
Response.Write("<script>alert('"+exp.Message+"');location.href='WebForm8.aspx'</script>");
}
}
}
ましょ
う。効率はかなり高くなりますか?
何か間違っている場合は、修正してください。