随笔-18  评论-96  文章-15  trackbacks-6

写出代码之前,先说明一下原理,比较简单。有一张表(test)如下 
结构是:id(自动编号) txt   假设40条记录)
现在要每页显示10条记录,则每页要显示的数据应该是:
第一页:1----10
第二页:11----20
第三页:21----30
第四页:31----40

如要显示第一页,最简单的方法就是 select top 10 * from test 就OK了。

第二页开始呢?怎么做呢?请接着看:
比如我要显示第三页:也就是21----30
原理:找出不要的数据也就是1----20,最大的id,这是里20
再找出大于这个id(20) 前10条记录就OK了。

原理知道后写代码就简单了,前台界面比较简单,不多说,代码如下

<asp:LinkButton id="lbtnFirst" Runat="server">首頁</asp:LinkButton>
<asp:LinkButton id="lbtnBack" Runat="server">上頁</asp:LinkButton>
<asp:LinkButton id="lbtnNext" Runat="server">下頁</asp:LinkButton>
<asp:LinkButton id="lbtnLast" Runat="server">尾頁</asp:LinkButton>
<asp:Label id="Label1" runat="server">当前页:</asp:Label>
<asp:Label id="lblCurrentPage" runat="server">1</asp:Label>
<asp:Label id="Label2" runat="server">总页:</asp:Label>
<asp:Label id="lblPageCount" runat="server">200</asp:Label>
<asp:Label id="Label3" runat="server">跳转:</asp:Label>
<asp:TextBox id="txtToPage" runat="server" Width="88px"></asp:TextBox>
<asp:Button id="btnToPage" runat="server" Text="go"></asp:Button>
<asp:DataGrid id="DataGrid1" runat="server" AllowPaging="True" AllowCustomPaging="True"></asp:DataGrid>

后台代码:

 

private void Page_Load(object sender, System.EventArgs e)
  
{
   
if (!Page.IsPostBack)
   
{
    
//开始显示第一页
    ShowDate(Convert.ToInt64(lblCurrentPage.Text));
   }

  }


  
/// <summary>
  
/// 显示数据
  
/// </summary>
  
/// <param name="page"></param>

  private void ShowDate(long page)
  
{
        
           
   
/*-------------------设置参数------------------*/

   
string tblName  = "test";
   
string fldName  = "id";
   
string orderStr = "asc";
   
int  PageSize = 10;
    
   
/*-------------------设置结束------------------*/

   
byte[] t =Convert.FromBase64String(System.Configuration.ConfigurationSettings.AppSettings["conStr"]);

   
string conStr = System.Text.ASCIIEncoding.ASCII.GetString(t);


   SqlConnection conn 
= new SqlConnection(conStr);
   conn.Open();
   SqlCommand cmd 
= new SqlCommand("select count(*) from " + tblName,conn);
   lblPageCount.Text 
= Convert.ToString(((int)cmd.ExecuteScalar() / PageSize + 1));
   DataGrid1.VirtualItemCount 
= Convert.ToInt32(lblPageCount.Text);//datadrid每次就显示一页,所有要手动加上总页
   
   
string sql = string.Empty;

   sql 
= "select top " + Convert.ToString((page - 1* PageSize) + " " + fldName + " from " + tblName +  " order by " + fldName + " " + orderStr; //排除的记录部分
   sql = "select max (" + fldName + ") from ( " + sql + " ) as t"//得到排除记录里的最大ID号
   sql = "select top " + PageSize.ToString() + " * from " + tblName + " where " + fldName + ">(" + sql + ") order by " + fldName + " " + orderStr;
   
   
if (page == 1){sql = "select top " + PageSize + " * from " + tblName;lblCurrentPage.Text = "1";}

   
try
   
{
    SqlDataAdapter da 
= new SqlDataAdapter(sql,conn);
    System.Data.DataSet ds 
= new DataSet();
    da.Fill(ds);
    DataGrid1.DataSource 
= ds.Tables[0].DefaultView;
    DataGrid1.DataBind();  

    conn.Close();

   }

   
catch ( Exception ex)
   
{
    Response.Write(ex.Message.ToString());
   }

   
  }


  
/// 首页
  private void lbtnFirst_Click(object sender, System.EventArgs e)
  
{
   lblCurrentPage.Text 
= "1";
   ShowDate(
1);
  }


  
/// 上页
  private void lbtnBack_Click(object sender, System.EventArgs e)
  
{
   
if (lblCurrentPage.Text != "1")
   
{
    lblCurrentPage.Text 
= Convert.ToString(Convert.ToInt64(lblCurrentPage.Text) - 1);
    ShowDate(Convert.ToInt64(lblCurrentPage.Text));
   }

  }


  
/// 下页
  private void lbtnNext_Click(object sender, System.EventArgs e)
  
{
   
if (lblCurrentPage.Text != lblPageCount.Text)
   
{
    lblCurrentPage.Text 
= Convert.ToString(Convert.ToInt64(lblCurrentPage.Text) + 1);
    ShowDate(Convert.ToInt64(lblCurrentPage.Text));
   }

  }


  
/// 尾页
  private void lbtnLast_Click(object sender, System.EventArgs e)
  
{
   lblCurrentPage.Text 
= lblPageCount.Text;
   ShowDate(Convert.ToInt64(lblPageCount.Text));
  }


  
/// 跳转
  private void btnToPage_Click(object sender, System.EventArgs e)
  
{
   
if ( Convert.ToInt64(txtToPage.Text.Trim()) > 0 && Convert.ToInt64(txtToPage.Text.Trim()) < Convert.ToInt64(lblPageCount.Text))
   
{
    lblCurrentPage.Text 
= txtToPage.Text;
    ShowDate(Convert.ToInt64(txtToPage.Text));
   }

  }


  
/// dataGrid单击的页数
  private void DataGrid1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
  
{
   DataGrid1.CurrentPageIndex 
= e.NewPageIndex;
   lblCurrentPage.Text 
= Convert.ToString(e.NewPageIndex + 1);
   ShowDate(e.NewPageIndex 
+ 1);
  }

 

亲自测试sql2000 460万条记录,显示速度很快
posted on 2006-08-07 18:27 xing 阅读(675) 评论(10)  编辑 收藏 所属分类: .net

评论:
#1楼  2006-08-08 17:16 | King_Boy_Hcc      
非常感谢,,,最近正在想为做得BBS排序,,刚好用上,,,呵呵,,谢谢了
  回复  引用  查看    
#2楼 [楼主] 2006-08-08 17:25 | xing      
@King_Boy_Hcc
能帮得上兄弟忙就行了^_^
  回复  引用  查看    
#3楼  2006-08-15 07:01 | メ冰枫ぱ雪      
呵呵,我也在做,给了点思路。。 不过我是用存储过程做的 = =+!!
  回复  引用  查看    
#4楼 [楼主] 2006-08-15 08:07 | xing      
@メ冰枫ぱ雪
其实也一样的,使用参数一样也可以做到的
  回复  引用  查看    
#5楼  2006-09-02 16:27 | メ冰枫ぱ雪      
恩,还真的得感谢下你哈。。

交个朋友好吗。。?

偶的QQ:570389199 , Popo:lantk@163.com
  回复  引用  查看    
#6楼 [楼主] 2006-09-02 22:17 | xing      
@メ冰枫ぱ雪
当然可以了,我加你QQ
  回复  引用  查看    
#7楼  2006-10-29 01:41 | 心不在焉      
你的sql语句是这样写的吗?
USE [AjaxDemo]
GO
/****** 对象: StoredProcedure [dbo].[pageM] 脚本日期: 10/29/2006 01:40:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

create proc [dbo].[pageM]

@Start int,
@PageCount int
as
select top (@PageCount) * from a where id not in (select top (@Start-1) id from a)
  回复  引用  查看    
#8楼  2007-02-05 18:17 | 游客 [未注册用户]
有没有源码文件下载啊老哥,我是初哥。用不了,不知那里出错。
或能发个源码文件给我吗?wininfo@tom.com谢谢
  回复  引用    
#9楼  2007-02-06 12:14 | 游客 [未注册用户]
大哥,可以说一下有那些名命空间吗?
我改成这么样,报错,初学.NET的不知道是什么问题.

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Text;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Data.SqlClient;


public partial class Search : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
if (!Page.IsPostBack)
{
//开始显示第一页
ShowDate(Convert.ToInt64(lblCurrentPage.Text));
}
}

/**//// <summary>
/// 显示数据
/// </summary>
/// <param name="page"></param>
private void ShowDate(long page)
{


/**//*-------------------设置参数------------------*/

string tblName = "db";
string fldName = "id";
string orderStr = "asc";
int PageSize = 10;

/**//*-------------------设置结束------------------*/

SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]);
conn.Open();
SqlCommand cmd = new SqlCommand("select count(*) from " + tblName,conn);
lblPageCount.Text = Convert.ToString(((int)cmd.ExecuteScalar() / PageSize + 1));
DataGrid1.VirtualItemCount = Convert.ToInt32(lblPageCount.Text);//datadrid每次就显示一页,所有要手动加上总页

string sql = string.Empty;

sql = "select top " + Convert.ToString((page - 1) * PageSize) + " " + fldName + " from " + tblName + " order by " + fldName + " " + orderStr; //排除的记录部分
sql = "select max (" + fldName + ") from ( " + sql + " ) as t"; //得到排除记录里的最大ID号
sql = "select top " + PageSize.ToString() + " * from " + tblName + " where " + fldName + ">(" + sql + ") order by " + fldName + " " + orderStr;

if (page == 1){sql = "select top " + PageSize + " * from " + tblName;lblCurrentPage.Text = "1";}

try
{
SqlDataAdapter da = new SqlDataAdapter(sql,conn);
System.Data.DataSet ds = new DataSet();
da.Fill(ds);
DataGrid1.DataSource = ds.Tables[0].DefaultView;
DataGrid1.DataBind();

conn.Close();

}
catch ( Exception ex)
{
Response.Write(ex.Message.ToString());
}

}

/**//// 首页
private void lbtnFirst_Click(object sender, System.EventArgs e)
{
lblCurrentPage.Text = "1";
ShowDate(1);
}

/**//// 上页
private void lbtnBack_Click(object sender, System.EventArgs e)
{
if (lblCurrentPage.Text != "1")
{
lblCurrentPage.Text = Convert.ToString(Convert.ToInt64(lblCurrentPage.Text) - 1);
ShowDate(Convert.ToInt64(lblCurrentPage.Text));
}
}

/**//// 下页
private void lbtnNext_Click(object sender, System.EventArgs e)
{
if (lblCurrentPage.Text != lblPageCount.Text)
{
lblCurrentPage.Text = Convert.ToString(Convert.ToInt64(lblCurrentPage.Text) + 1);
ShowDate(Convert.ToInt64(lblCurrentPage.Text));
}
}

/**//// 尾页
private void lbtnLast_Click(object sender, System.EventArgs e)
{
lblCurrentPage.Text = lblPageCount.Text;
ShowDate(Convert.ToInt64(lblPageCount.Text));
}

/**//// 跳转
private void btnToPage_Click(object sender, System.EventArgs e)
{
if ( Convert.ToInt64(txtToPage.Text.Trim()) > 0 && Convert.ToInt64(txtToPage.Text.Trim()) < Convert.ToInt64(lblPageCount.Text))
{
lblCurrentPage.Text = txtToPage.Text;
ShowDate(Convert.ToInt64(txtToPage.Text));
}
}

/**//// dataGrid单击的页数
private void DataGrid1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
DataGrid1.CurrentPageIndex = e.NewPageIndex;
lblCurrentPage.Text = Convert.ToString(e.NewPageIndex + 1);
ShowDate(e.NewPageIndex + 1);
}
}
  回复  引用    
#10楼 [楼主] 2007-02-11 11:32 | xing      
@游客
不好意思,很久上博客了
命名空间在MSDN Library有详细说明的
从你的命名空间看你使用的是vs2005

你把
SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]);

改成:
System.Configuration.ConfigurationManager.AppSettings["ConnectionString"].ToString()


试试看

  回复  引用  查看    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  博客园首页

  新闻频道

  社区

  小组

  博问

  网摘

  闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-09-04 20:37 编辑过


相关链接: