我使用的是datalist绑定的方式获取数据,分页的时候遇到了困难:(绑定代码如下)
                  <asp:DataList runat="server" ID="DataList2" BorderWidth="0" BorderColor="Red" DataSourceID="SqlDataSource1" RepeatColumns="2">
                    <ItemTemplate>
                      <table>
                              <tr>
                               <td>
                                 <asp:Image ID="imagedata" runat="server" Width="65" Height="92" ImageUrl='<%# "~/Default.aspx?id=" + DataBinder.Eval(Container.DataItem,"[\"ImageID\"]").ToString() %>'/>
                               </td>
                               <td width="120" height="92">
                                 <b>A:</b><asp:Label ID="Label2" runat="server" Text='<%# Eval("ImageDescription") %>'></asp:Label><br />
                               </td>
                              </tr>
                      </table>
                    </ItemTemplate>
                 </asp:DataList>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="Data Source=SMARTSOFT;Initial Catalog=testdb;User ID=sa;password=;"
            SelectCommand="SELECT top 10 * FROM test"></asp:SqlDataSource>
           <asp:ObjectDataSource ID="ObjectDataSource1" runat="server">
</asp:ObjectDataSource>

解决方案 »

  1.   

    晕.datalist本来就不能分页,如果非得要分页,基本与以前2003的处理方法一样.国外有个人也写了一个datalist的分页示例,用的是objectdatasource,存贮过程内实现分页处理.
      

  2.   

    http://www.baidu.com/s?wd=DataList+%B7%D6%D2%B3&cl=3Repeater和DataList控件提供了一个快速、灵活的表现数据的方式,但是,它们没有内建的分页功能;DataGrid控件提供了内建的分页功能,但它的结构比较复杂。
      

  3.   

    Sub DataPageBind(ByVal tmpTable As DataTable)
            Dim myPageUrl As String
            Dim myPageNums As Integer                    '当前页码
            Dim myTotalRecord As Integer                 '总记录数
            Dim objTmp As New PagedDataSource            '实例化一个分页数据源
            Dim myDv As New DataView(tmpTable)           '实例化一个排序数据视图
            myDv.Sort = tmpSortRule                      '定义排序规则
            objTmp.DataSource = myDv                     '赋值
            objTmp.AllowPaging = True                    '允许分页
            objTmp.PageSize = myPageSize                 '传递每页记录数
            myTotalRecord = objTmp.DataSourceCount       '取得当前分页数据源中的总记录数
            ImgsCount = myTotalRecord
            myPageNums = Request("Page")
            If myPageNums = vbNullString OrElse IsNumeric(myPageNums) = False Then
                myPageNums = 1
            Else
                myPageNums = Convert.ToInt32(myPageNums)
            End If
            objTmp.CurrentPageIndex = myPageNums - 1
            myPageUrl = Request.CurrentExecutionFilePath
            PageStr.Text = PageString(myPageSize, myTotalRecord, myPageNums, myPageUrl, "&obj=" & Request("obj"))        ImgList.DataSource = objTmp
            ImgList.DataBind()
            ImgList.DataKeyField = "Name"
        End Sub
        Function PageString(ByVal tmpPageSize As Integer, ByVal tmpTotalRecord As Integer, ByVal tmpPageNums As Integer, ByVal tmpPageUrl As String, ByVal Other As String) As String
            Dim myStr As String
            Dim TotalPage As Integer
            Dim i As Integer
            Dim Tmp As String
            If tmpTotalRecord = 0 Then Exit Function
            If tmpTotalRecord Mod tmpPageSize > 0 Then
                TotalPage = Fix(tmpTotalRecord / myPageSize) + 1
            Else
                TotalPage = tmpTotalRecord / myPageSize
            End If
            myStr += "共 " & tmpTotalRecord & " 个文件  共 " & FormatNumber(TotalSize / 1024, 2, -1) & " K  每页 " & tmpPageSize & " 个文件   当前 " & tmpPageNums & "/" & TotalPage & " 页     "
            If Not tmpPageNums = 1 Then
                myStr += "[<a href=" & tmpPageUrl & "?Page=1" & Other & ">第一页</a>][<a href=" & tmpPageUrl & "?Page=" & Convert.ToString(tmpPageNums - 1) & Other & ">上一页</a>]"
            End If
            If Not tmpPageNums = TotalPage Then
                myStr += "[<a href=" & tmpPageUrl & "?Page=" & Convert.ToString(tmpPageNums + 1) & Other & ">下一页</a>][<a href=" & tmpPageUrl & "?Page=" & TotalPage & Other & ">最后页</a>]"
            End If
            Return myStr
        End Function
      

  4.   

    datalist分页有很多种方式。网上这方面资料很多
    我见过的有三种:
    SQL存储过程。viewstate,PagedDataSource控件。
    下面贴上第三种分页方法。我封装成了一个类
     //分页绑定
        public void ListBind(DataList Mylist,LinkButton up,LinkButton down,Label curpage,ref Label pagecount)
        {
            Connection.Close();
            int Curpage = Convert.ToInt32(curpage.Text);
            Connection.Open();
            string Sql = "select * from book  order by posttime desc";
            OleDbDataAdapter Ada = new OleDbDataAdapter(Sql, Connection);
            DataSet Myset = new DataSet();
            Ada.Fill(Myset,"table");
            PagedDataSource PgSource = new PagedDataSource();
            PgSource.DataSource = Myset.Tables["table"].DefaultView;
            PgSource.AllowPaging = true;
            PgSource.PageSize = 3;
            PgSource.CurrentPageIndex = Curpage - 1;
            pagecount.Text = Convert.ToString(PgSource.PageCount);
            up.Enabled = true;
            down.Enabled = true;
            if (Curpage==1)
            {
                up.Enabled = false;
            }
            if (Curpage == PgSource.PageCount)
            {
                down.Enabled = false;
            }
            Mylist.DataSource = PgSource;
            Mylist.DataBind();
            Connection.Close();
            
            
        }
      

  5.   

    有两种方法实现:1、使用数据库的存储过程
    http://donet.it.com.cn/articles/90464.htm2、使用PagedDataSource类实现
    http://rainic.5151j.com.cn/article_view.asp?type=2&id=657
      

  6.   

    可以用控件实现DATALIST分页,网上能找到
      

  7.   

    存储过程:
    CREATE proc cutpage_record
    @RecordCount int output,  --返回总记录数
    @QueryStr nvarchar(100),--表名、视图名、查询语句
    @PageSize int,  --每页的大小(行数)
    @PageCurrent int,  --要显示的页
    @FdShow nvarchar (1000), --要显示的字段列表
    @WhereStr nvarchar (4000),
    @FdOrder nvarchar(100), --排序
    @PageCount  int output   --返回总页数
    as
    declare
    @sql nvarchar(4000)
    set @sql = ''
    if @WhereStr = '' begin
    set @WhereStr = '1=1'
    end
    if @FdShow = '' begin
    set @FdShow = '*'
    enddeclare @tsql nvarchar (200)set @tsql=N'select @RecordCount = count(*) from ' + @QueryStr + ' where ' + @WhereStr
    exec sp_executesql @tsql,N'@RecordCount int output',@RecordCount output
    set @pageCount=ceiling(@recordCount*1.0/@pageSize)
    if @PageCurrent = 1 begin
    set @sql = 'select top ' + cast(@PageSize as nvarchar(3)) + ' ' + @FdShow + ' from ' + @QueryStr + ' where ' + @WhereStr  +' order by ' + @FdOrder + ' desc'
    end
    else begin
      set @sql = 'select top ' + cast(@PageSize as nvarchar(3)) + ' ' + @FdShow + ' from ' + @QueryStr + ' where ' + @WhereStr + ' and ' + @FdOrder + '< ( select min(' + @FdOrder + ') from (select top ' + cast(@PageSize*(@PageCurrent-1) as nvarchar(10)) + ' ' + @FdOrder + ' from ' + @QueryStr + ' where ' + @WhereStr + ' order by ' + @FdOrder + ' desc'+  ') as t) order by ' + @FdOrder +' desc'
    end 
    --print @sql
    execute(@sql)
    GOASP.NET部分代码:
    private void Page_Load(object sender, System.EventArgs e)
    {
    //页面初始化,显示第一页,并将当前页存在一个隐藏控件里
    if (!(Page.IsPostBack))
    {
                                 Hidden3.Value="1"; 
    GridBind(1);
    }
    } public void GridBind(int c_page)   //绑定DataList,参数:当前页
    {
    string strsql= GetStrsql();   //获取查询条件,无'WHERE'
    DataList1.DataSource=LoadDB(strsql,c_page);
    DataList1.DataBind();
    }
    /// 分页显示程序
    /// <param name="mysql">数据库连接字符串</param>
    /// <param name="tablename">查询用的表名</param>
    /// <param name="pagesize">每页显示的记录数</param>
    /// <param name="currentpage">要显示的页数</param>
    /// <param name="where">查询的条件</param>
    /// <param name="columnorder">排序的列</param>
    /// <returns>返回总记录数</returns>
    /// <returns>返回总页数</returns>
    public DataSet DsCutPage(string mysql,string tablename,int pagesize,int currentpage,string where,string columnorder,out double recordCount,out double pageCount)
    {
    SqlConnection sqlConn_R=new SqlConnection(mysql); SqlCommand cmd = new SqlCommand("cutpage_record",sqlConn_R);
    cmd.CommandType = CommandType.StoredProcedure;

    SqlParameter p7 = cmd.Parameters.Add("@RecordCount",SqlDbType.Int);
    p7.Direction = ParameterDirection.Output; SqlParameter p8 = cmd.Parameters.Add("@pageCount",SqlDbType.Int);
    p8.Direction = ParameterDirection.Output; SqlParameter p = cmd.Parameters.Add("@QueryStr",SqlDbType.NVarChar,100);
    p.Value = tablename; SqlParameter p1 = cmd.Parameters.Add("@PageSize",SqlDbType.Int);
    p1.Value = pagesize; SqlParameter p2 = cmd.Parameters.Add("@PageCurrent",SqlDbType.Int);
    p2.Value = currentpage; SqlParameter p3 = cmd.Parameters.Add("@FdShow",SqlDbType.NVarChar,1000);
    p3.Value = "*"; SqlParameter p5 = cmd.Parameters.Add("@WhereStr",SqlDbType.NVarChar,4000);
    p5.Value = where; SqlParameter p6 = cmd.Parameters.Add("@FdOrder",SqlDbType.NVarChar,100);
    p6.Value = columnorder; DataSet ds = new DataSet();
    SqlDataAdapter da  = new SqlDataAdapter();
    da.SelectCommand = cmd; da.Fill(ds); recordCount = double.Parse(da.SelectCommand.Parameters["@RecordCount"].Value.ToString());
    pageCount = double.Parse(da.SelectCommand.Parameters["@PageCount"].Value.ToString()); return ds;
    } private DataSet LoadDB(string strSQL,int cruu_page)   //从数据库读入数据到DateSet,参数strSQL为查询用的SQL语句,参数cruu_page为当前页
    {
    string strConnection = ConfigurationSettings.AppSettings["connstring"];
    double row_coun,page_coun;
    DataSet ds=DsCutPage(strConnection,"MyDataBase",15,cruu_page,strSQL,"id",out row_coun,out page_coun);
    string a=row_coun.ToString()+","+page_coun.ToString();
    Hidden2.Value=a;  //将总记录数和总页数存在隐藏控件中
    return ds;
    }
    private void DataList1_ItemCommand(object source, System.Web.UI.WebControls.DataListCommandEventArgs e)
    {
    //在DataList的<FooterTemplate>中定义了控制跳转的按钮,附后~
    switch (e.CommandName)
    {
    case "ch_page":    //页面跳转
    cur_page=Convert.ToInt16(Hidden3.Value.Trim());
    int intPageCruu=cur_page;
    string b=Hidden2.Value;
    string[] arrya=b.Split(',');
    int intPageCoun=Convert.ToInt16(arrya[1].Trim());
    switch (e.CommandArgument.ToString())
    {
    case "next":
    cur_page=Math.Min(intPageCruu + 1, intPageCoun);
    break;
    case "prev":
    cur_page=Math.Max(intPageCruu -1, 1);
    break;
    case "last":
    cur_page=intPageCoun;
    break;
    default:
    cur_page=1;
    break;
    }
    Hidden3.Value=cur_page.ToString();
    DataList1.SelectedIndex = -1;
    GridBind(cur_page);
    break;
    default:
    break;
    }
    private void DataList1_ItemDataBound(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)
    {
    if(e.Item.ItemType==ListItemType.Footer)
    {
    string b=Hidden2.Value;  //获得总记录数和页数
    string c=Hidden3.Value;  //获得当前页
    string[] arrya=b.Split(',');
    HtmlGenericControl a=new HtmlGenericControl();
    a=(HtmlGenericControl)e.Item.FindControl("r_coun");
    a.InnerText=arrya[0];
    a=(HtmlGenericControl)e.Item.FindControl("p_coun");
    a.InnerText=arrya[1];
    a=(HtmlGenericControl)e.Item.FindControl("p_cuur");
    a.InnerText=c;
    }
    }ASP.NET页面DataList的部分:
    <FooterTemplate>
    <TABLE cellSpacing="0" cellPadding="5" width="742" border="0">
    <tr>
    <td width="470">总共&nbsp;<label id="p_coun" runat="server" />&nbsp;页,记录&nbsp;<label id="r_coun" runat="server" />&nbsp;条&nbsp;第
    <label id="p_cuur" runat="server" />&nbsp;页&nbsp;&nbsp;&nbsp;&nbsp;
    <asp:linkbutton id="btnFirst" CommandName="ch_page" runat="server" CommandArgument="0" ForeColor="navy"
    Font-size="8pt" Font-Name="verdana">首页</asp:linkbutton>&nbsp;
    <asp:linkbutton id="btnPrev" CommandName="ch_page" runat="server" CommandArgument="prev" ForeColor="navy"
    Font-size="8pt" Font-Name="verdana">前一页</asp:linkbutton>&nbsp;
    <asp:linkbutton id="btnNext" CommandName="ch_page" runat="server" CommandArgument="next" ForeColor="navy"
    Font-size="8pt" Font-Name="verdana">后一页</asp:linkbutton>&nbsp;
    <asp:linkbutton id="btnLast" CommandName="ch_page" runat="server" CommandArgument="last" ForeColor="navy"
    Font-size="8pt" Font-Name="verdana">尾页</asp:linkbutton>
    </td>
    <td width="170"><font color="#990000">提示:点击图片按钮进行操作</font></td>
    </tr>
    </TABLE>
    </FooterTemplate>基本的意思应该可以看出来了.......
    你自己再整理一下~
      

  8.   

    作为测试,先将:
    string strsql= GetStrsql();   //获取查询条件,无'WHERE'
    改为:
    string strsql= "id<>0";      //或者其他的一个简单查询条件....
      

  9.   


            PagedDataSource objpage;
            const string url = "News.aspx";
    private void BindData()
            {
                string sql = "select * from News  order by ID asc";
                OleDbDataAdapter da = new OleDbDataAdapter(sql, cn);
                DataSet ds = new DataSet();
                da.Fill(ds, "TB");
                //分页开始
                objpage = new PagedDataSource();
                objpage.DataSource = ds.Tables["TB"].DefaultView;
                objpage.AllowPaging = true;
                objpage.PageSize = 20;
                int curpage;
                if (Request.QueryString["Page"] != null)
                    curpage = Convert.ToInt32(Request.QueryString["Page"]);
                else
                    curpage = 1;
                objpage.CurrentPageIndex = curpage - 1;
                if (objpage.IsFirstPage && !objpage.IsLastPage)
                {
                    this.hlProv.Enabled = false;
                    this.hlNext.NavigateUrl = url + "?page=" + Convert.ToInt32(curpage + 1);
                    this.hlFirst.Enabled = false;
                    this.hlLast.NavigateUrl = url + "?page=" + Convert.ToInt32(objpage.PageCount);
                }
                else
                {
                    if (objpage.IsLastPage && !objpage.IsFirstPage)
                    {
                        this.hlFirst.NavigateUrl = url + "?page=" + 1;
                        this.hlLast.Enabled = false;
                        this.hlNext.Enabled = false;
                        this.hlProv.NavigateUrl = url + "?page=" + Convert.ToInt32(curpage - 1);
                    }
                    else
                    {
                        if (objpage.IsFirstPage && objpage.IsLastPage)
                        {
                            this.hlLast.Enabled = false;
                            this.hlNext.Enabled = false;
                            this.hlProv.Enabled = false;
                            this.hlFirst.Enabled = false;
                        }
                        else
                        {
                            this.hlFirst.NavigateUrl = url + "?page=" + 1;
                            this.hlLast.NavigateUrl = url + "?page=" + Convert.ToInt32(objpage.PageCount);
                            this.hlNext.NavigateUrl = url + "?page=" + Convert.ToInt32(curpage + 1);
                            this.hlProv.NavigateUrl = url + "?page=" + Convert.ToInt32(curpage - 1);
                        }
                    }
                }
                //
                this.DataList2.DataSource = objpage;
                this.DataList2.DataBind();
                //
                this.lblcur.Text = Convert.ToInt32(objpage.CurrentPageIndex + 1).ToString();
                this.lblPageCount.Text = objpage.PageCount.ToString();
                this.lblCount.Text = ds.Tables["TB"].Rows.Count.ToString();
                this.tbPageIndex.Text = Convert.ToString((objpage.CurrentPageIndex + 1));
                cn.Close();
            }
      

  10.   

    “如果我点击下一页,执行的结果还是前10条记录”.....这个是肯定的~
    另外,你的“下一页”的代码呢?
    删除  DataSourceID="SqlDataSource1" 
    删除 <asp:SqlDataSource ...>在 </ItemTemplate>  之间插入以下代码   </asp:DataList> <FooterTemplate>
    <TABLE cellSpacing="0" cellPadding="5" width="742" border="0">
    <tr>
    <td width="470">总共&nbsp;<label id="p_coun" runat="server" />&nbsp;页,记录&nbsp;<label id="r_coun" runat="server" />&nbsp;条&nbsp;第
    <label id="p_cuur" runat="server" />&nbsp;页&nbsp;&nbsp;&nbsp;&nbsp;
    <asp:linkbutton id="btnFirst" CommandName="ch_page" runat="server" CommandArgument="0" ForeColor="navy"
    Font-size="8pt" Font-Name="verdana">首页</asp:linkbutton>&nbsp;
    <asp:linkbutton id="btnPrev" CommandName="ch_page" runat="server" CommandArgument="prev" ForeColor="navy"
    Font-size="8pt" Font-Name="verdana">前一页</asp:linkbutton>&nbsp;
    <asp:linkbutton id="btnNext" CommandName="ch_page" runat="server" CommandArgument="next" ForeColor="navy"
    Font-size="8pt" Font-Name="verdana">后一页</asp:linkbutton>&nbsp;
    <asp:linkbutton id="btnLast" CommandName="ch_page" runat="server" CommandArgument="last" ForeColor="navy"
    Font-size="8pt" Font-Name="verdana">尾页</asp:linkbutton>
    </td>
    <td width="170"><font color="#990000">提示:点击图片按钮进行操作</font></td>
    </tr>
    </TABLE>
    </FooterTemplate>数据库操作的代码稍微改一下,
    1、改成你的表名‘test’;
    2、表的关键字段有吗?取代代码中的‘id’;
    3、string strConnection = ConfigurationSettings.AppSettings["connstring"];改成你的数据库连接语句...
      

  11.   

    ////第一次报错
    Compiler Error Message: CS0103: The name 'Hidden3' does not exist in the current contextSource Error: Line 55:         if (!(Page.IsPostBack))
    Line 56:         {
    Line 57:             Hidden3.Value = "1";
    Line 58:             GridBind(1);
    Line 59:         }
     Source File: e:\Project\Code\Alibooks\Default.aspx.cs    Line: 57 
    /////第二次报错(发生在我注释上面一行代码之后)Compiler Error Message: CS0103: The name 'cur_page' does not exist in the current contextSource Error: Line 134:        {
    Line 135:            case "ch_page":    //页面跳转
    Line 136:                cur_page = Convert.ToInt16(Hidden3.Value.Trim());
    Line 137:                int intPageCruu = cur_page;
    Line 138:                string b = Hidden2.Value;
     Source File: e:\Project\Code\Alibooks\Default.aspx.cs    Line: 136 你的隐藏控件是怎么申请有的啊?能加我的QQ:332998001吗?我头都快大了!
      

  12.   

    TO: artak(甜葡萄) 可行,
      

  13.   

    TO: artak(甜葡萄) ,CCjian(默契)可行,你这个可行是怎么用的,看不明白,能再说详细一点吗?急!
      

  14.   

    http://dotnet.aspx.cc/ShowDetail.aspx?id=47DD34FD-ED0B-4455-94E8-CD9F63E19893
    孟老大上面有不少例子,可以看看
      

  15.   

    artak(甜葡萄)
    请问这段代码this.hlNext.NavigateUrl = url + "?page=" + Convert.ToInt32(curpage + 1);
     为何用  url  ???
      不用 Request.CurrentExecutionFilePath 呀!!
    请赐教!!!!
    在线等
      

  16.   

    有谁能帮我解答一下
    我将万分感激请问这段代码this.hlNext.NavigateUrl = url + "?page=" + Convert.ToInt32(curpage + 1);
     为何用  url  ???
      不用 Request.CurrentExecutionFilePath 呀!!
    请赐教!!!!
      

  17.   

    用datagrid加一个aspnetpage这个软件分页不是很简单的吗?   干嘛搞的自己这么复杂
      

  18.   

    请问这段代码this.hlNext.NavigateUrl = url + "?page=" + Convert.ToInt32(curpage + 1);
    这里用的是一个控件,LZ可去找到,原理用它在当前地址栏里传递分页号码,然后取出来使用如下:
      curpage = Convert.ToInt32(Request.QueryString["Page"]);
    LZ细分下,就会明白了.
    用存储过分页,那可是很牛的,呵呵!
      

  19.   

    to"wangxueyan()"
    aspnetpage asp.net2.0上好用吗?