我最近学到Asp.net分页时卡住了,我看了一本教材,代码如下:<%@ Page Language="C#" CodeFile="index.aspx.cs" Inherits="NianDi_NewWeb.NianDi" AutoEventWireup="true"%>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=gb2312" />
<title>全力搞定ASP.NET</title>
<link href="new_css.css" rel="stylesheet" type="text/css" />
</head><body>
<div class="Mmeo">
快速导航:<a href="index.aspx">返回首页</a>&nbsp;&nbsp;<a href="InsertFile.aspx">插入数据页面</a><hr>
<form runat="server">
<asp:DataGrid id="dg_a" runat="server" AllowPaging="true" AllowCustomPaging="true" PageSize="2" PagerStyle-mode="NumericPages" PagerStyle-PrevPageText="上一页" PagerStyle-NextPageText="下一页" OnPageIndexChanged="DataGrid_PageChanged" HeaderStyle-BackColor="#aaaadd" AlternatingItemStyle-BackColor="#eeeeee" AutoGenerateColumns="False">
<Columns>
<asp:BoundColumn HeaderText="编号" DataField="c_id" />
<asp:BoundColumn HeaderText="公司名称" DataField="CommName" />
<asp:BoundColumn HeaderText="公司性质" DataField="CommXz" />
<asp:TemplateColumn HeaderText="公司缩略图">
<ItemTemplate>
<img src="<%# DataBinder.Eval(Container.DataItem,"CommPic")%>" width="80" border="0" />
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
<hr>
<asp:DataList id="score" AlternatingItemStyle-BackColor="#eeeeee" OnItemCommand="DataList_ItemCommand" HeaderStyle-BackColor="#aaaadd" SelectedItemStyle-BackColor="yellow" RepeatLayout="Table" runat="server">
<HeaderTemplate>
演示DataList控件
</HeaderTemplate>
<ItemTemplate>
公司名称:<%# DataBinder.Eval(Container.DataItem,"CommName")%><asp:LinkButton id="btnselected" Text="详细信息" CommandName="select" runat="server" />
</ItemTemplate>
<SelectedItemTemplate>
<img src="<%# DataBinder.Eval(Container.DataItem,"CommPic")%>" width="80" border="0" style="margin:6 0 6 0;border:1px solid black;" /><br>
公司名称:<%# DataBinder.Eval(Container.DataItem,"CommName")%><br>
公司性质:<%# DataBinder.Eval(Container.DataItem,"CommXz")%><br>
公司说明:<%# DataBinder.Eval(Container.DataItem,"CommContent")%><br>
注册日期:<%# DataBinder.Eval(Container.DataItem,"CommDate")%>
</SelectedItemTemplate>
</asp:DataList>
</form>
</div>
</body>
</html>using System;
using System.Data;
using System.Text;
using System.Web;
using System.Data.OleDb;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Collections;namespace NianDi_NewWeb
{
public partial class NianDi : Page
{
OleDbConnection MyConn;
void Page_load(object sender,EventArgs e)
{
string ConnString = "provider=microsoft.jet.oledb.4.0;data source="+Server.MapPath("Compantry.mdb");
MyConn = new OleDbConnection(ConnString);
BindGrid();
DataList_Bind();
}

ICollection CreateTable()
{
MyConn.Open();
DataSet ds = new DataSet();
string sql = "select * from Companer";
OleDbDataAdapter MyAdapter = new OleDbDataAdapter(sql,MyConn);
MyAdapter.Fill(ds,"Atable");
MyConn.Close();
return ds.Tables["Atable"].DefaultView;
}

void BindGrid()
{
DataView dv = (DataView)CreateTable();
dg_a.VirtualItemCount = dv.Count;
dg_a.DataSource = dv;
dg_a.DataBind();
}

public void DataGrid_PageChanged(object sender,DataGridPageChangedEventArgs e)
{
dg_a.CurrentPageIndex = e.NewPageIndex;
BindGrid();
}

void DataList_Bind()
{
score.DataSource = CreateTable();
score.DataBind();
}

public void DataList_ItemCommand(object sender,DataListCommandEventArgs e)
{
score.SelectedIndex = e.Item.ItemIndex;
DataList_Bind();
}
}
}/*
 * 数据库名称:Compantry.mdb
 * 表名:Companer
 * c_id
 * CommName
 * CommXz
 * CommPic
 * CommImages
 * CommContent
 * CommDate
 * */
不管怎么弄,就是只显示第一页,这是怎么回事?同时我还想向高手们请教一下,如果我想要 << < 1 2 3 4 5 6 > >>这样的分页格式该怎么写代码呢?请把代码贴上来好吧同时我在网上找资料时,发现有人用存储过程写过分页的代码,如果有朋友会这方面的技术,也一同贴上来分享一下好吧

解决方案 »

  1.   

    看看这个
    DataGrid是一个功能非常强大的ASP.NET Web服务器端控件,它除了能够方便地按各种方式格式化显示表格中的数据,还可以对表格中的数据进行动态的排序、编辑和分页。使Web开发人员从繁琐的代码中解放。实现DataGrid的分页功能一直是很多初学ASP.NET的人感到棘手的问题,特别是自定义分页功能,实现方法多种多样,非常灵活。本文将向大家介绍一种DataGird控件在Access数据库下的快速分页法,帮助初学者掌握DataGrid的分页技术。  目前的分页方法  DataGrid内建的分页方法是使用诸如“SELECT * FROM <TABLE>”的SQL语句从数据库表中取出所有的记录到DataSet中,DataGrid控件绑定到该DataSet之后,它的自动分页功能会帮你从该DataSet中筛选出当前分页的数据并显示出来,其他没有用的数据将被丢弃。  还有一种方法是使用自定义分页功能,先将DataGrid的AllowCustomPaging属性设置为True,再利用DataAdapter的Fill方法将数据的筛选工作提前到填充DataSet时,而不是让DataGrid帮你筛选:public int Fill (
     DataSet dataSet, //要填充的 DataSet。
     int startRecord, //从其开始的从零开始的记录号。
     int maxRecords, //要检索的最大记录数。
     string srcTable //用于表映射的源表的名称。
    );
      该方法首先将来自查询处的结果填充到DataSet中,再将不需要显示的数据丢弃。当然,自定义分页功能需要完成的事情还不止这些,本文将在后面详细介绍。  以上两种方法的工作原理都是先从数据库中取出所有的记录,然后筛选出有用的数据显示出来。可见,两种方法的效率基本上是一致的,因为它们在数据访问阶段并没有采取有效的措施来减少Access对磁盘的访问次数。对于小数量的记录,这种开销可能是比较小的,如果针对大量数据的分页,开销将会非常巨大,从而导致分页的速度非常的慢。换句话说,就算每个DataGrid分页面要显示的数据只是一个拥有几万条记录的数据库表的其中10条,每次DataGrid进行分页时还是要从该表中取出所有的记录。  很多人已经意识到了这个问题,并提出了解决方法:用自定义分页,每次只从数据库中取出要显示的数据。这样,我们需要在SQL语句上下功夫了。由于Access不支持真正的存储过程,在编写分页算法上就没有SQL Server那么自由了。SQL Server可以在存储过程中利用临时表来实现高效率的分页算法,受到了广泛的采用。而对于Access,我们必须想办法在一条SQL语句内实现最高效的算法。  用一条SQL语句取得某段数据的方法有好几种。算法不同,效率也就不同。我经过粗略的测试,发现效率最差的SQL语句执行时耗费的时间大概是效率最高的SQL语句的3倍!而且这个数值会随着记录总数的增加而增加。下面将介绍其中两条常用的SQL语句。  为了方便接下来的讨论,我们先约定如下:变量 说明 变量 说明 @PageSize 每页显示的记录总数 @MiddleIndex 中间页的索引 @PageCount 分页总数 @LastIndex 最后一页的索引 @RecordCount 数据表的记录总数 @TableName 数据库表名称 @PageIndex 当前页的索引 @PrimaryKey 主键字段名称 @FirstIndex 第一页的索引 @QueryFields 要查询的字段集
    变量 定义 @PageCount (int)Math.Ceiling((double)@RecordCount / @PageSize) @FirstIndex 0 @LastIndex @PageCount – 1 @MiddleIndex (int)Math.Ceiling((double)@PageCount / 2) – 1
      先让我们看看效率最差的SQL语句:SELECT TOP @PageSize * FROM @TableName 
    WHERE @PrimaryKey NOT IN ( 
     SELECT TOP @PageSize*@PageIndex @PrimaryKey FROM @TableName 
     ORDER BY @PrimaryKey ASC 
    ) ORDER BY @PrimaryKey ASC 
      这条SQL语句慢就慢在NOT IN这里,主SELECT语句遍历的每个@PrimaryKey的值都要跟子SELECT语句的结果集中的每一个@PrimaryKey的值进行比较,这样时间复杂度非常大。这里不得不提醒一下大家,平时编写SQL语句时应该尽量避免使用NOT IN语句,因为它往往会增加整个SQL语句的时间复杂度。  另一种是使用了两个TOP和三个ORDER BY的SQL语句,如下所示:SELECT * FROM ( 
     SELECT TOP @PageSize * FROM ( 
     SELECT TOP @PageSize*(@PageIndex+1) * FROM @TableName 
      ORDER BY @PrimaryKey ASC
     ) TableA ORDER BY @PrimaryKey DESC 
    ) TableB ORDER BY @PrimaryKey ASC   这条SQL语句空间复杂度比较大。如果要显示的分页面刚好是最后一页,那么它的效率比直接SELECT出所有的记录还要低。因此,对于分页算法,我们还应该具体情况具体分析,不能一概而论。下面将简单介绍一下相关概念,如果您对主键和索引非常熟悉,可以直接跳过。 有关主键和索引的概念  在 ACCESS中,一个表的主键(PRIMARY KEY,又称主索引)必然是唯一索引(UNIQUE INDEX),它的值是不会重复的。除此之外,索引依据索引列的值进行排序,每个索引记录包含着一个指向它所引用的数据行的指针,这对ORDER BY的执行非常有帮助。我们可以利用主键这两个特点来实现对某条记录的定位,从而快速地取出某个分页上要显示的记录。  举个例子,假设主键字段为INTEGER型,在数据库表中,记录的索引已经按主键字段的值升序排好(默认情况下),那么主键字段值为“11”的记录的索引,肯定刚好在值为“12”的记录的索引前面(假设数据库表中存在主键的值为“12”的记录)。如果主键字段不具备UNIQUE约束,数据库表中将有可能存在两个或两个以上主键字段的值为“11”的记录,这样就无法确定这些记录之间的前后位置了。  下面就让我们看看如何利用主键来进行数据的分段查询吧。  快速分页法的原理  其实该分页法是从其他方法衍生而来的。本人对原来的方法认真地分析,发现通过优化和改进可以非常有效地提高它的效率。原算法本身效率很高,但缺乏对具体问题的具体分析。同一个分页算法,可能在取第一页的数据时效率非常高,但是在取最后一页的数据时可能反而效率更低。  经过分析,我们可以把分页算法的效率状态分为四种情况:  (1)@PageIndex <= @FirstIndex   (2)@FirstIndex < @PageIndex <= @MiddleIndex   (3)@MiddleIndex < @PageIndex < @LastIndex   (4)@PageIndex >= @LastIndex   状态(1)和(4)分别表示第一页和最后一页。它们属于特殊情况,我们不必对其使用特殊算法,直接用TOP就可以解决了,不然会把问题复杂化,反而降低了效率。对于剩下的两种状态,如果分页总数为偶数,我们可以看作是从数据库表中删掉第一页和最后一页的记录,再把剩下的按前后位置平分为两部分,即前面的一部分,也就是状态(2),后面的为另一部分,也就是状态(3);如果分页总数为奇数,
      

  2.   

    则属于中间页面的记录归于前面的部分。这四种状态分别对应着四组SQL语句,每组SQL语句由升序和降序两条SQL语句组成。  下面是一个数据库表,左边第一列是虚拟的,不属于该数据库表结构的一部分,它表示相应记录所在的分页索引。该表将用于接下来的SQL语句的举例中:PageIndex ItemId ProductId Price 0 001 0011 $12 002 0011 $13 1 003 0012 $13 004 0012 $11 2 005 0013 $14 006 0013 $12 3 007 0011 $13 008 0012 $15 4 009 0013 $12 010 0013 $11
      由表可得:@PageSize = 2,@RecordCount = 10,@PageCount = 5   升序的SQL语句  (1)@PageIndex <= @FirstIndex  取第一页的数据是再简单不过了,我们只要用TOP @PageSize就可以取出第一页要显示的记录了。SELECT TOP @PageSize @QueryFields FROM @TableName WHERE @Condition ORDER BY @PrimaryKey ASC
      (2)@FirstIndex < @PageIndex <= @MiddleIndex  把取数据表前半部分记录和取后半部分记录的SQL语句分开写,可以有效地改善性能。后面我再详细解释这个原因。现在看看取前半部分记录的SQL语句。先取出当前页之前的所有记录的主键值,再从中选出最大值,然后取出主键值大于该最大值的前@PageSize条记录。这里@PrimaryKey的数据类型可以不是INTEGER类型,CHAR、VARCHAR等其他类型照样可以。SELECT TOP @PageSize @QueryFields FROM @TableName WHERE @PrimaryKey > ( SELECT MAX(@PrimaryKey) FROM ( SELECT TOP @PageSize*@PageIndex @PrimaryKey FROM @TableName WHERE @Condition ORDER BY @PrimaryKey ASC ) TableA ) WHERE @Condition ORDER BY @PrimaryKey ASC  例如:@PageIndex=1,红-->黄-->蓝
      (3)@MiddleIndex < @PageIndex < @LastIndex  接下来看看取数据库表中后半部分记录的SQL语句。该语句跟前面的语句算法的原理是一样的,只是方法稍微不同。先取出当前页之后的所有记录的主键值,再从中选出最小值,然后取出主键值小于该最小值的前@PageSize条记录。SELECT * FROM ( SELECT TOP @PageSize @QueryFields FROM @TableName WHERE @PrimaryKey < ( SELECT MIN(@PrimaryKey) FROM ( SELECT TOP (@RecordCount-@PageSize*(@PageIndex+1)) @PrimaryKey FROM @TableName WHERE @Condition ORDER BY @PrimaryKey DESC ) TableA ) WHERE @Condition ORDER BY @PrimaryKey DESC ) TableB ORDER BY @PrimaryKey ASC
      之所以把取数据表前半部分记录和取后半部分记录的SQL语句分开写,是因为使用取前半部分记录的SQL语句时,当前页前面的记录数目随页数递增,而我们还要从这些记录中取出它们的主键字段的值再从中选出最大值。这样一来,分页速度将随着页数的增加而减慢。因此我没有这样做,而是在当前页索引大于中间页索引时(@MiddleIndex < @PageIndex)选用了分页速度随着页数的增加而加快的算法。由此可见,假设把所有分页面划分为前面、中间和后面三部分,则最前面和最后面的分页速度最快,最中间的分页速度最慢。  例如:@PageIndex=3,红 --> 黄 --> 蓝
      (4)@PageIndex >= @LastIndex  取最后一页的记录可以简单地使用类似状态(1)的做法:SELECT * FROM ( SELECT TOP @PageSize @QueryFields FROM @TableName WHERE @Condition ORDER BY @PrimaryKey DESC ) TableA ORDER BY @PrimaryKey ASC
      不过,这样产生的最后一页不一定是实际意义上的最后一页。因为最后一页的记录数未必刚好跟@PageSize相等,而上面的SQL语句是直接取得倒数的@PageSize条记录。如果想要精确地取得最后一页的记录,应该在先计算出该页的记录数,作为TOP语句的条件:SELECT * FROM ( SELECT TOP (@RecordCount-@PageSize*@LastIndex) @QueryFields FROM @TableName WHERE @Condition ORDER BY @PrimaryKey DESC ) TableA ORDER BY @PrimaryKey ASC 降序的SQL语句  降序的SQL语句跟升序的大同小异,这里就不在罗嗦了J  (1)@PageIndex <= @FirstIndexSELECT TOP @PageSize @QueryFields FROM @TableName WHERE @Condition ORDER BY @PrimaryKey DESC
      (2)@FirstIndex < @PageIndex <= @MiddleIndexSELECT TOP @PageSize @QueryFields FROM @TableName WHERE 
      

  3.   

    @PrimaryKey < ( SELECT MIN(@PrimaryKey) FROM ( SELECT TOP @PageSize*@PageIndex @PrimaryKey FROM @TableName WHERE @Condition ORDER BY @PrimaryKey DESC ) TableA ) WHERE @Condition ORDER BY @PrimaryKey DESC
      (3)@MiddleIndex < @PageIndex < @LastIndexSELECT * FROM ( SELECT TOP @PageSize @QueryFields FROM @TableName WHERE @PrimaryKey > ( SELECT MAX(@PrimaryKey) FROM ( SELECT TOP (@RecordCount-@PageSize*(@PageIndex+1)) @PrimaryKey FROM @TableName WHERE @ConditionORDER BY @PrimaryKey ASC ) TableA ) WHERE @ConditionORDER BY @PrimaryKey ASC ) TableB ORDER BY @PrimaryKey DESC
      (4)@PageIndex >= @LastIndexSELECT * FROM ( SELECT TOP (@RecordCount-@PageSize*@LastIndex) @QueryFields 
     FROM @TableName WHERE @Condition ORDER BY @PrimaryKey ASC 
    ) TableA ORDER BY @PrimaryKey DESC
      如何动态产生上述的SQL语句?  看了上面的SQL语句之后,相信大家已经基本明白该分页法的原理了。下面,我们将要设计一个动态生成SQL语句的类FastPaging。该类有一个公有静态方法,它根据您给出的条件动态生成SQL语句,作为方法的返回值。// 产生根据指定字段排序并分页查询的 SELECT 语句。public static String Paging(int pageSize, //每页要显示的记录的数目。int pageIndex, //要显示的页的索引。int recordCount, //数据表中的记录总数。String tableName, //要查询的数据表。String queryFields, //要查询的字段。String primaryKey, //主键字段。bool ascending, //是否为升序排列。String condition //查询的筛选条件。) {StringBuilder sb = new StringBuilder();int pageCount = GetPageCount(recordCount,pageSize); //分页的总数int middleIndex = GetMidPageIndex(pageCount); //中间页的索引int firstIndex = 0; //第一页的索引int lastIndex = pageCount - 1; //最后一页的索引if (pageIndex <= firstIndex) {// 代码略} else if (pageIndex > firstIndex && pageIndex <= middleIndex) {sb.Append("SELECT TOP ").Append(pageSize).Append(" ").Append(queryFields).Append(" FROM ").Append(tableName).Append(" WHERE ").Append(primaryKey);if (ascending)sb.Append(" > (").Append(" SELECT MAX(");elsesb.Append(" < (").Append(" SELECT MIN(");sb.Append(primaryKey).Append(") FROM ( SELECT TOP ").Append(pageSize*pageIndex).Append(" ").Append(primaryKey).Append(" FROM ").Append(tableName);if (condition != String.Empty)sb.Append(" WHERE ").Append(condition);sb.Append(" ORDER BY ").Append(primaryKey).Append(" ").Append(GetSortType(ascending)).Append(" ) TableA )");if (condition != String.Empty)sb.Append(" AND ").Append(condition);sb.Append(" ORDER BY ").Append(primaryKey).Append(" ").Append(GetSortType(ascending));} else if (pageIndex > middleIndex && pageIndex < lastIndex) {// 代码略} else if (pageIndex >= lastIndex) {// 代码略}return sb.ToString();}  除了Paging方法还有另外几个方法:// 根据记录总数和分页大小计算分页数。public static int GetPageCount(int recordCount, int pageSize) {return (int)Math.Ceiling((double)recordCount/pageSize);}// 计算中间页的页索引。public static int GetMidPageIndex(int pageCount) {return (int)Math.Ceiling((double)pageCount/2) - 1;}// 获取排序的方式("ASC"表示升序,"DESC"表示降序)public static String GetSortType(bool ascending) {return (ascending ? "ASC" : "DESC");}// 获取一个布尔值,该值指示排序的方式是否为升序。public static bool IsAscending(String orderType) {return ((orderType.ToUppe
      

  4.   

    http://www.newasp.net/tech/net/10951.html
    http://www.cnblogs.com/jianphu/articles/743013.html
    参考
      

  5.   

    DataGrid基于Access的快速分页法。r() == "DESC") ? false : true);} 让DataGrid工作起来  有了上面的类,实现分页的工作就简单多了。首先,我们要将DataGrid的AllowPaging属性和AllowCustomPaging属性为True,除此之外,为了体现出升序和降序的功能,还需要将AllowSorting属性也设置为True。然后在每次分页时,我们需要产生一个OleDbDataReader对象或DataView对象绑定到DataGrid,作为DataGrid的数据源。这里需要用FastPaging类的Paging方法根据条件产生一个SQL语句,并赋给OleDbCommand对象的CommandText属性:cmd.CommandText = FastPaging.Paging(DataGrid1.PageSize, (int)ViewState["CurrentPageIndex"], DataGrid1.VirtualItemCount, "Items", "ItemId, ProductId, Price", "ItemId", FastPaging.IsAscending(OrderType), "");
      在上面的程序段中,ViewState["CurrentPageIndex"]的值在DataGrid的Page事件处理程序中被更新为e.NewPageIndex。为了方便处理ViewState的空值,最好把对ViewState["CurrentPageIndex"]的存取操作和空值判断封装在一个属性里。DataGrid1. VirtualItemCount应该设置为数据库表中的记录总数。DataGrid通过它和PageSize属性可以虚拟出DataGrid的分页数。VirtualItemCount的值是在Page的Load事件处理程序中被设置的,而该值的大小需要经过一次数据库访问才能得到。为了提高性能,可以只在第一次加载页面的时候设置该值。  总结  DataGrid基于Access的快速分页法到这里就介绍完了。当然,这种方法并不能“包治百病”,可能对于您的要实现的功能,还有其它更好的方法。这就需要大家在平时工作和学习中不断总结经验,在解决实际问题时尽可能找到最有效的方法。这也是本文的方法中所贯穿的思想。 
      

  6.   

    用第三方控件就可以解决了 AspnetPager。
      

  7.   

    用第三方控件就可以解决了 AspnetPager。
      

  8.   

    楼主用DataGrid控件实现自定义分页,需要设置VirtualItemCount=你的表记录总数。
      

  9.   

    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
           
            DataGrid1.AllowCustomPaging = true;
            DataGrid1.AllowPaging = true;
            DataGrid1.PageSize = 10;
            DataGrid1.VirtualItemCount = 90;
            
            DataGrid1.CurrentPageIndex = 0;
            DataGrid1.DataSource = GetData();
            DataGrid1.DataBind();
        }    private IList GetData()
        {
            IList list = new ArrayList();        SqlConnection cnn = new SqlConnection("database=xcerp;uid=sa;pwd=1;server=(local)");
            cnn.Open();
            //SqlCommand cmd = new SqlCommand("select top 100 * from MWH_SendBack", cnn);
            
            //DataTable dt = new DataTable();
            //SqlDataAdapter sda = new SqlDataAdapter("select top 60 * from MWH_SendBack", cnn);       
            //sda.Fill(dt);
            //return dt;        SqlCommand cmd = new SqlCommand("select top 10 KeyId,SendBackNO  from MWH_SendBack", cnn);
            SqlDataReader rdr = cmd.ExecuteReader();
            while (rdr.Read())
            { 
                list.Add(new SendBack(rdr.GetInt32(0),rdr.GetString(1)));
            }
            rdr.Close();
            cnn.Close();
            return list;        }}
      

  10.   

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="TestDataGridPageing.aspx.cs" Inherits="_Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>无标题页</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <br />
            <br />
            &nbsp;<asp:DataGrid ID="DataGrid1" runat="server">
                <PagerStyle Mode="NumericPages" />
                <Columns>
                    <asp:BoundColumn DataField="KeyId" HeaderText="KeyId"></asp:BoundColumn>
                    <asp:BoundColumn DataField="SendBackNO" HeaderText="SendBackNO"></asp:BoundColumn>
                </Columns>
            </asp:DataGrid></div>
        </form>
    </body>
    </html>
      

  11.   

    如果是用vs2005的GridView控件自定义分页,他没有VirtualItemCount属性,可以用ObjectDataSource控件实现。
    我前段时间转asp.net也遇到这个问题,查了点资料,自己就解决了。
      

  12.   

    DataGrid的AllowPaging属性有置为true么?
      

  13.   

    我没有没有必要在分页这个问题上浪费太多时间,用控件即可。
    /// <summary>
            /// 分页函数
            /// </summary>
            /// <param name="pageSize">每页记录记录数</param>
            /// <param name="navNum">数字页码显示个数</param>
            /// <param name="firstPage">首页</param>
            /// <param name="prevPage">上页</param>
            /// <param name="nextPage">下页</param>
            /// <param name="lastPage">末页</param>
            /// <param name="leftHtml">页码左边内容</param>
            /// <param name="rightHtml">页码右边内容</param>
            /// <param name="outerSpace">首上下末间空格</param>
            /// <param name="innerSpace">数字页码间空格</param>
            /// <param name="urlParam">要转向的URL地址,须加?号</param>
            /// <param name="tableKey">表的主键</param>
            /// <param name="tableName">表的名称</param>
            /// <param name="theField">表的字段</param>
            /// <param name="theWhere">以where开头,不能为空</param>
            /// <param name="theOrder">排序语句,可为空</param>
            /// <param name="currentPage">当前页,从1开始</param>
            /// <param name="cmdParam">含参数的Command对象</param>
            /// <param name="objs">参数列表</param>
            public static Hashtable ExecutePage(int pageSize, int navNum, string firstPage, string prevPage, string nextPage, string lastPage, string leftHtml, string rightHtml, string outerSpace, string innerSpace, string urlParam, string tableKey, string tableName, string theField, string theWhere, string theOrder, int currentPage, SqlCommand cmdParam, params object[] objs)
            {
                int num = 0;
                Hashtable ha = new Hashtable();            if (navNum % 2 == 0) navNum++;
                if (firstPage == "0")
                {
                    firstPage = "<font face=webdings>9</font>";
                    prevPage = "<font face=webdings>7</font>";
                    nextPage = "<font face=webdings>8</font>";
                    lastPage = "<font face=webdings>:</font>";
                }
                if (prevPage == "0")
                {
                    firstPage = "";
                    prevPage = "<font face=webdings>7</font>";
                    nextPage = "<font face=webdings>8</font>";
                    lastPage = "";
                }            SqlCommand cmd = cmdParam;
                if (cmd == null) cmd = new SqlCommand();            try
                {
                    cmd.Connection = new SqlConnection(ConnectionString);
                    cmd.CommandText = "select count(*) from " + tableName + " " + theWhere;
                    for (int i = 0; i < objs.Length; i += 2) cmd.Parameters.Add(objs[i].ToString(), objs[i + 1]);
                    cmd.Connection.Open();
                    num = Convert.ToInt32(cmd.ExecuteScalar());
                }
                catch (SqlException ex)
                {
                    ErrorMessage = ex.Message;
                }
                finally
                {
                    cmd.Connection.Close();
                }            int total = (num - 1) / pageSize + 1;
                if (currentPage < 1 || currentPage > num || num < 1) return null;
                string sql = "select top " + pageSize + " " + theField + " from " + tableName + " " + theWhere + " " + theOrder;
                if (currentPage != 1) sql = "select top " + pageSize + " " + theField + " from " + tableName + " " + theWhere + " and " + tableKey + " not in (select top " + pageSize * (currentPage - 1) + " " + tableKey + " from " + tableName + " " + theWhere + " " + theOrder + ") " + theOrder;
                cmd.CommandText = sql;
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                DataSet ds = new DataSet();
                da.Fill(ds);            string span = "<span>";
                if (currentPage != 1)
                {
                    span += "<a title='首页' href='" + urlParam + "&page=1'>" + firstPage + "</a>" + outerSpace;
                    span += "<a title='上一页' href='" + urlParam + "&page=" + (currentPage - 1) + "'>" + prevPage + "</a>" + outerSpace;
                }
                else
                {
                    span += "<a disabled=disabled>" + firstPage + "</a>" + outerSpace;
                    span += "<a disabled=disabled>" + prevPage + "</a>" + outerSpace;
                }
                if (navNum > 0)
                {
                    int start = 1, end = total, len = navNum / 2;
                    if (navNum < total)
                    {
                        start = currentPage - len;
                        end = currentPage + len;
                        if (start < 1)
                        {
                            start = 1;
                            end = navNum;
                        }
                        if (end > total)
                        {
                            start = total - navNum + 1;
                            end = total;
                        }
                    }
                    for (int i = start; i <= end; i++)
                    {
                        if (i == currentPage)
                        {
                            //span += "<font color=red>" + leftHtml + i + rightHtml + "</font>" + innerSpace;
                            span += i + innerSpace;
                        }
                        else
                        {
                            if (i != end)
                            {
                                span += "<a title='第" + i + "页' href='" + urlParam + "&page=" + i + "'>" + leftHtml + i + rightHtml + "</a>" + innerSpace;
                            }
                            else
                            {
                                span += "<a title='第" + i + "页' href='" + urlParam + "&page=" + i + "'>" + leftHtml + i + rightHtml + "</a>";
                            }
                        }
                    }
                    span = span.Trim(' ');
                    span += outerSpace;
                }
                if (currentPage != total)
                {
                    span += "<a title='下一页' href='" + urlParam + "&page=" + (currentPage + 1) + "'>" + nextPage + "</a>" + outerSpace;
                    span += "<a title='尾页' href='" + urlParam + "&page=" + ((num - 1) / pageSize + 1) + "'>" + lastPage + "</a>";
                }
                else
                {
                    span += "<a disabled=disabled>" + nextPage + "</a>" + outerSpace;
                    span += "<a disabled=disabled>" + lastPage + "</a>";
                }
                ha.Add("MainPage", span);
                span = "<table cellpadding=0 cellspacing=0 width=100% style='margin-top:10px'><tr><td style='padding-left:10px;padding-top:2px'>第<font color=red>" + currentPage + "</font>页 共<font color=red>" + total + "</font>页 每页<font color=red>" + pageSize + "</font>条记录 共<font color=red>" + num + "</font>条记录</td><td align=right>" + span + "</td></tr></table>";
                ha.Add("AutoPage", span);
                span = "\n<input id=goto size=1 value=" + currentPage + " onchange=\"location.href='" + urlParam + "&page='+document.getElementById('goto').value\">\n<input type=button size=1 value=GO onclick=\"location.href='" + urlParam + "&page='+document.getElementById('goto').value\">";
                ha.Add("GotoPage", span);
                span = "\n<select onchange=\"location.href='" + urlParam + "&page='+this.value\">\n";
                for (int i = 1; i <= total; i++) span += "\t<option value=" + i + (i == currentPage ? " selected" : "") + ">第" + i + "页</option>\n";
                span += "</select>\n";
                ha.Add("SelectPage", span);
                ha.Add("CurrentPage", currentPage);
                ha.Add("TotalPage", total);
                ha.Add("PageSize", pageSize);
                ha.Add("TotalRecords", num);
                ha.Add("DataSet", ds);
                return ha;
            }
      

  14.   

    分页存储过程
    CREATE procedure Get_Product 
    (@startIndex int, 
    @endIndex int, 
    @docount bit) 
    as 
    set nocount on 
    if(@docount=1) 
    select count(*) AS Counts from Product 
    else 
    begin 
    declare @indextable table(id int identity(1,1),nid int) 
    set rowcount @endIndex 
    insert into @indextable(nid) select ID from Product  order by ID desc 
    select * from Product O,@indextable t where O.ID=t.nid 
    and t.id between @startIndex and @endIndex order by t.id 
    end 
    set nocount off GO 
      

  15.   

    我现在的思路有点乱,以至于暂时不明白大家给出的解决方案....郁闷哦,谁能帮我看看,我自己写的那个程序,为什么老显示第一页,而且我把AllowCustomPaging="true"设置好了呀,这到底是为什么,我快疯了
      

  16.   

    说实话,让我说清楚< < < 1 2 3 4 5 6 > >>这种格式怎么手工写出来,我还真不会。
    为什么不用aspnetpager?可以很容易实现这种样式。难道你的项目在分页这方面,
    非要要求这手工写?恐怕大家都不手工写吧。
      

  17.   

    呵呵,我只是非常想动手写一下而已,我学这个并不是为了找份工作,而是为技术的痴迷,我现在的工作不是做Asp.net方面,而且我写的程序大都是用记事本编出来的,我从来不用IDE,我的代码是通过命令行工具,预编译的(aspnet_compiler -v / -u -f -p e:\testnet d:\FristNet),或许这在许多程序员眼中是不是一种病态,但是我就想搞清楚它,我曾经写过一个"续表技术"是源自于一个突发奇想,忽然有一天我发现"自动编号"ID的最大值应该是int的最大设定值,大约20亿个是吗,我怕哪天会因为信息过大,而把这个表给撑死,于是制作了相同字段的不同名称的表,用一个自己写的函数把它们连通起来,而且可以用程序控制它们三个同时在一个页面中显示数据,而且是带有分页功能的哦,呵呵,其实是我想多了,一般把表撑死那是需要很长时间,很多人同时发信息的,但是我却真的完成了那个突发奇想的"续表技术"的设想,并写出了解决代码,这次遇到了Asp.net的分页,但是我现在还没有搞明白它的分页原理,怎样才能使它分页呢?DataGrid如果不设置AllowCustomPaging,那么完全可以不用这么麻烦就能实现分页技术,可是它的原理我不明白,想要扩展它,就很困难,希望各位朋友,高手能跟我说说这个,使我可以明白它,谢谢
      

  18.   

    OnPageIndexChanged="DataGrid_PageChanged"
    改成
    OnPageIndexChanged="DataGrid_PageChanging"
      

  19.   

    应该在page_load里加上if(!IsPostBack){ datagrid绑定}, 分页事件时,点击就会执行page_load,所以每回都是第一页! 不知说地对不!