Primeiro crie uma tabela (requer numeração automática de IDs):
criar tabela redheadedfile(
id int identidade(1,1),
nomes de arquivos nvarchar(20),
enviar usuário nvarchar(20),
chave primária (id)
)
Então escrevemos 500.000 registros:
declare @i int
definir @i=1
enquanto @i<=500000
começar
insira em redheadedfile (nomes de arquivos, senduser) valores ('meu algoritmo de paginação', 'Lu Junming')
definir @i=@i+1
fim
IR
Use o Microsoft Visual Studio .NET 2003 para criar uma página WebForm (chamei-a de webform8.aspx)
O trecho de código front-end é o seguinte (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>
<CABEÇA>
<title>WebForm8</title>
<meta content="Microsoft Visual Studio .NET 7.1" nome="GERADOR">
<meta content="C#" name="CODE_LANGUAGE">
<meta content="JavaScript" name="vs_defaultClientScript">
<meta content=" http://schemas.microsoft.com/intellisense/ie5 " name="vs_targetSchema">
</HEAD>
<corpo MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="servidor">
<asp:datalist id="datalist1" AlternatingItemStyle-BackColor="#f3f3f3" Width="100%" CellSpacing="0"
CellPadding="0" Runat="servidor">
<ItemTemplate>
<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>
</tabela>
</ItemTemplate>
</asp:datalist>
<div align="center">Total<asp:label id="LPageCount" Runat="server" ForeColor="#ff0000"></asp:label>Páginas/Total
<asp:label id="LRecordCount" Runat= "server" ForeColor="#ff0000"></asp:label>Registro
<asp:linkbutton id="Fistpage" Runat="server"
CommandName="0">Home</asp:linkbutton> <asp:linkbutton id="Prevpage" Runat="server" CommandName ="prev">
Página anterior</asp:linkbutton> <asp:linkbutton id="Nextpage" Runat="server"
CommandName="next">Próxima página</asp:linkbutton >  ; <asp:linkbutton id="Lastpage" Runat="server"
CommandName="last">Última página</asp:linkbutton> Página atual<asp: ID do rótulo ="LCurrentPage" Runat="server"
ForeColor="#ff0000"></asp:label>Página Pular página<asp:TextBox ID="gotoPage" Runat="server" Largura ="30px "
MaxLength="5" AutoPostBack="True"></asp:TextBox></div>
</form>
</body>
</HTML>
O trecho de código de fundo é o seguinte (webform8.aspx.cs)
usando o sistema;
usando System.Collections;
usando System.ComponentModel;
usando System.Data;
usando System.Drawing;
usando System.Web;
usando System.Web.SessionState;
usando System.Web.UI;
usando System.Web.UI.WebControls;
usando System.Web.UI.HtmlControls;
usando System.Data.SqlClient;
o namespace
System.Configuration;
{
/// <resumo>
/// Descrição resumida do WebForm8.
/// </sumário>
classe pública WebForm8: System.Web.UI.Page
{
System.Web.UI.WebControls.LinkButton protegido Fistpage;
System.Web.UI.WebControls.LinkButton página anterior protegida;
System.Web.UI.WebControls.LinkButton protegido Próxima página;
System.Web.UI.WebControls.LinkButton última página protegida;
System.Web.UI.WebControls.DataList protegido datalist1;
System.Web.UI.WebControls.DropDownList protegido mydroplist;
System.Web.UI.WebControls.Label protegido LPageCount;
System.Web.UI.WebControls.Label protegido LRecordCount;
System.Web.UI.WebControls.Label LCurrentPage protegido;
System.Web.UI.WebControls.TextBox protegido gotoPage;
const int PageSize=20; //Define os registros exibidos em cada página
int PageCount,RecCount,CurrentPage,Pages,JumpPage;//Define diversas variáveis para salvar parâmetros de paginação
private void Page_Load (remetente do objeto, System.EventArgs e)
{
if(!IsPostBack)
{
RecCount = Calc();//Obtém o número total de registros através da função Calc()
PageCount = RecCount/PageSize + OverPage();//Calcula o número total de páginas (mais a função OverPage() para evitar que restos causem
dados de exibição incompletos)
ViewState["PageCounts"] = RecCount/PageSize -
ModPage();/ /Salvar total de parâmetros da página em ViewState (menos a função ModPage() para evitar que o intervalo de consulta estoure quando a instrução SQL for executada. Você pode usar o algoritmo de paginação do procedimento armazenado para entender esta frase)
ViewState["PageIndex"] = 0;//Salva um valor de índice de página 0 em ViewState
ViewState["JumpPages"] = PageCount;//Salve PageCount em ViewState e determine se o número de entrada do usuário excede o intervalo
de números de página
ao pular.
//Exibe o status de LPageCount e LRecordCount
LPageCount.Text = PageCount.ToString();
LRecordCount.Text = RecCount.ToString();
//Determina se a caixa de texto de salto de página é inválida
if(RecCont <= 20)
gotoPage.Enabled = falso;
TDataBind();//Chama a função de vinculação de dados TDataBind() para realizar operações de vinculação de dados
}
}
//Calcula as páginas restantes
público int OverPage()
{
int páginas = 0;
if(RecCount%PageSize! = 0)
páginas = 1;
outro
páginas = 0;
páginas de retorno;
}
//Calcula as páginas restantes para evitar que o intervalo de consulta exceda quando a instrução SQL for executada.
public int ModPage()
{
int páginas = 0;
if(RecCount%PageSize == 0 && RecCount != 0)
páginas = 1;
outro
páginas = 0;
páginas de retorno;
}
/*
*Função estática para calcular o total de registros
*A razão pela qual uso funções estáticas aqui é: se dados estáticos ou funções estáticas forem referenciados, o conector otimizará o código gerado e removerá os itens de realocação dinâmica (
o efeito de paginação de tabelas de dados massivas é mais óbvio).
*Espero que você me dê sua opinião e me corrija se houver algum erro.
*/
público estático int Calc()
{
int Contagem de registros = 0;
SqlCommand MyCmd = new SqlCommand("selecione contagem(*) como co from redheadedfile",MyCon());
SqlDataReader dr = MyCmd.ExecuteReader();
if(dr.Leitura())
RecordCount = Int32.Parse(dr["co"].ToString());
MyCmd.Connection.Close();
return Contagem de registros;
}
//Instrução de conexão do banco de dados (obtida em Web.Config)
SqlConnection MyCon() estático público
{
SqlConnection MyConnection = new SqlConnection(ConfigurationSettings.AppSettings["DSN"]);
MinhaConexão.Open();
return MinhaConexão;
}
//Opera os valores CommandName retornados pelos quatro botões (Home Page, Previous Page, Next Page, Last Page)
private void Page_OnClick(objeto remetente, CommandEventArgs e)
{
CurrentPage = (int)ViewState["PageIndex"];//Lê o valor do número da página de ViewState e salva-o na variável CurrentPage para
cálculo
do parâmetro
Pages = (int)ViewState["PageCounts"];//Lê a string total de operação do parâmetro da página em ViewState
cmd = e.CommandName;
switch(cmd) // Filtrar nome do comando
{
caso "próximo":
PáginaAtual++;
quebrar;
caso "anterior":
Página Atual--;
quebrar;
caso "último":
PáginaAtual = Páginas;
quebrar;
padrão:
PáginaAtual = 0;
quebrar;
}
ViewState["PageIndex"] = CurrentPage;//Salva a variável CurrentPage calculada em ViewState novamente
TDataBind();//Chama a função de vinculação de dados TDataBind()
}
privado vazio TDataBind()
{
CurrentPage = (int)ViewState["PageIndex"];//Lê o valor do número da página de ViewState e salva-o na variável CurrentPage para operação de
invalidação
de botão
Pages = (int)ViewState["PageCounts"];//Lê o total de parâmetros da página do ViewState para realizar cálculos de invalidação de botão
//Determina o status dos quatro botões (página inicial, página anterior, próxima página, última página)
if (Página Atual + 1 > 1)
{
Fistpage.Enabled = verdadeiro;
Prevpage.Enabled = true;
}
outro
{
Fistpage.Enabled = falso;
Página anterior.Enabled = falso;
}
if (CurrentPage == Páginas)
{
Próxima página.Enabled = falso;
Últimapágina.Enabled = falso;
}
outro
{
Próxima página.Enabled = verdadeiro;
Últimapágina.Enabled=true;
}
//ligação de dados ao controle DataList
DataSet ds = new DataSet();
//Instruções SQL principais, executam operações de consulta (determina a eficiência da paginação:))
SqlDataAdapter MyAdapter = new SqlDataAdapter("Selecione Top "+PageSize+" * from redheadedfile onde id
não está (selecione top "+PageSize*CurrentPage+" id de redheadedfile ordene por id asc) ordene por id asc",MyCon());
MeuAdapter.Fill(ds,"notícias");
datalist1.DataSource = ds.Tables["notícias"].DefaultView;
datalist1.DataBind();
//Exibe o controle do rótulo LCurrentPaget e o controle da caixa de texto gotoPage status
LCurrentPage.Text = (CurrentPage+1).ToString();
gotoPage.Text = (CurrentPage+1).ToString();
//Libera SqlDataAdapter
MeuAdapter.Dispose();
}
#region Código gerado pelo Web Forms Designer
substituir void protegido OnInit (EventArgs e)
{
//
// CODEGEN: Esta chamada é exigida pelo designer de Web Forms do ASP.NET.
//
InitializeComponent();
base.OnInit(e);
}
/// <resumo>
/// O Designer suporta métodos necessários - não use o editor de código para modificar
/// O conteúdo deste método.
/// </sumário>
privado vazio 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 += new System.EventHandler(this.Page_Load })
;
#endregion
//Código da página de salto
private void gotoPage_TextChanged(objeto remetente, System.EventArgs e)
{
tentar
{
JumpPage = (int)ViewState["JumpPages"];//Lê o valor da página disponível em ViewState e salva-o na variável JumpPage
//Determina se o valor de entrada do usuário excede o valor do intervalo de páginas disponível
if(Int32.Parse(gotoPage.Text) > JumpPage || Int32.Parse(gotoPage.Text) <= 0)
Response.Write("<script>alert('Intervalo de páginas fora dos limites!');location.href='WebForm8.aspx'</script>");
outro
{
int InputPage = Int32.Parse(gotoPage.Text.ToString()) - 1;//Converta o valor de entrada do usuário e salve-o na
variável InputPage
do tipo int
ViewState["PageIndex"] = InputPage;//Escreve o valor InputPage em ViewState["PageIndex"]
TDataBind();//Chama a função de vinculação de dados TDataBind() para realizar a operação de vinculação de dados novamente
}
}
//Captura exceções causadas por usuários inserindo tipos de dados incorretos
catch(Exceção exp)
{
Response.Write("<script>alert('"+exp.Message+"');location.href='WebForm8.aspx'</script>");
}
}
}
}
Vamos tentar. A eficiência é muito maior?
Se houver algo errado, por favor me corrija.