2012-06-06 53 views
0

我有一個執行自定義查詢的頁面,該頁面保存在數據庫的某處。 我需要能夠在gridview上啓用分頁。如何使用ROW_NUMBER分頁GridView和SQL自定義查詢

例如目的查詢保存在數據庫上它是這樣的:

select * from requestbases 

這將返回10,000行。

用下面的方法讓它返回10行。

public DataTable GetGenericResults(string strsql, int pageIndex) 
{ 
    StringBuilder sb = new StringBuilder(); 
    sb.Append("WITH MyPagedData as ("); 
    int indexFrom = strsql.IndexOf("from"); 
    sb.Append(strsql.Substring(0, indexFrom)); 
    sb.Append(", "); 
    sb.Append("ROW_NUMBER() OVER(ORDER BY RequestBaseId DESC) as RowNum "); 
    sb.Append(strsql.Substring(indexFrom)); 
    sb.Append(") "); 
    sb.Append("SELECT * from MyPagedData where RowNum between @StartIndex and @StartIndex + 10"); 

    using(var connection = (SqlConnection)_context.Database.Connection) 
    { 
     var adapter = new SqlDataAdapter(sb.ToString(), connection); 
     adapter.SelectCommand.Parameters.Add("@StartIndex", SqlDbType.Int).Value = pageIndex; 
     var results = new DataSet(); 
     adapter.Fill(results, "Results"); 
     return results.Tables["Results"]; 
    } 
} 

這是電網

var datatable = RequestBaseBL.GetGenericResults(query.QuerySql, 0); 

if (datatable.Rows.Count > 0) 
{ 
    LblCount.Text = datatable.Rows.Count + " records"; 
    PanelResults.Visible = true; 
    GrvCustomResults.Visible = true; 
    GrvCustomResults.DataSource = datatable; 
    GrvCustomResults.DataBind(); 
} 

的問題是查詢本身返回10行,因此在GridView永遠不會顯示尋呼機綁定代碼。

<asp:GridView ID="GrvCustomResults" runat="server" Visible="false" AutoGenerateColumns="true"> 
    <PagerSettings 
      Visible="true" 
      Position="TopAndBottom" 
      PreviousPageText="Previous" 
      NextPageText="Next" 
      Mode="NumericFirstLast" /> 
    <HeaderStyle CssClass="gridheader" /> 

+0

你可以使用一個'ObjectDataSource'並設置它的'SelectCountMethod','SelectMethod'和'EnablePaging'。在這裏看看更多的信息:http://www.codeproject.com/Articles/125541/Effective-Paging-with-GridView-Control-in-ASP-NET –

+0

它沒有工作,我已經試過了,我想我的最好的選擇它的pageddatasource。 –

回答

3

這個代碼在aspx頁面

<asp:Panel runat="server" id="pnlPager" CssClass="pager"> 
    </asp:Panel> 

這裏將在 中的.cs頁面中使用這是用什麼方法來跟蹤頁次的紀錄and pagesize

 protected int PageNum 
     { 
      get { return Convert.ToInt16(ViewState["PageNum"]); } 
      set { ViewState["PageNum"] = value; } 
     } 

     protected int PageSize 
     { 
      get { return Convert.ToInt16(ViewState["PageSize"]); } 
      set { ViewState["PageSize"] = value; } 
     } 


protected int TotalRecord 
    { 
     get { return Convert.ToInt16(ViewState["TotalRecords"]); } 
     set { ViewState["TotalRecords"] = value; } 
    } 

這是用於調用存儲過程,將發送頁次的方法,頁面大小

public DataSet GetCollegeSerachData(int PageNum,int PageSize,out int TotalRecords) 
     { 
      DS = new DataSet(); 
      ObjDataWrapper = new DataWrapper(ClsCommon.CnnString, CommandType.StoredProcedure); 
      TotalRecords=0; 
      ErrorCount = 0; 
      Searchpattern = ""; 
      try 
      { 


       ObjDataWrapper.AddParameter("@PageNum", PageNum); 
       ObjDataWrapper.AddParameter("@PageSize", PageSize); 

       SqlParameter ObjTotalRecords=(SqlParameter)(ObjDataWrapper.AddParameter("@TotalRowsNum","",SqlDbType.Int,ParameterDirection.Output)); 



       DS=ObjDataWrapper.ExecuteDataSet("ADMJGetCollegeSearch"); 
       if(ObjTotalRecords.Value!= DBNull.Value || ObjTotalRecords!=null) 
       { 
        TotalRecords=Convert.ToInt32(ObjTotalRecords.Value); 
       } 

      } 
      catch (Exception Ex) 
      { 
       string err = Ex.Message; 
       if (Ex.InnerException != null) 
       { 
        err = err + " :: Inner Exception :- " + Ex.InnerException.Message; 
       } 
       string addInfo = "Error While Executing GetCollegeSerachData in ClsColleges:: -> "; 
       ClsExceptionPublisher objPub = new ClsExceptionPublisher(); 
       objPub.Publish(err, addInfo); 
      } 
      return DS; 
     } 

,將返回將用於對存儲過程

這裏的商店綁定數據集過程,將用於分頁

GO 
/****** Object: StoredProcedure [dbo].[ADMJGetCollegeSearch] Script Date: 06/06/2012 15:43:29 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[ADMJGetCollegeListByState] 
@PageNum int, 
@PageSize int, 
@TotalRowsNum int output 


AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 



    WITH College_CollegeId As 
    (
     SELECT 'RowNumber' = ROW_NUMBER() OVER(ORDER BY collegeid asc),College.* 
     FROM College 

    ) 


    -- Query result 
    SELECT * 
    FROM College_CollegeId 
    WHERE RowNumber BETWEEN (@PageNum - 1) * @PageSize + 1 AND @PageNum * @PageSize    
    ORDER BY collegename asc 

    -- Returns total records number 
    SELECT @TotalRowsNum = count(*) 
    FROM College 

END 

在最後你將結合在GridView grdCourse.DataSource = DS.Tables [0]; grdCourse.DataBind(); grdCourse.Visible = true;

在網格視圖的PageIndexChanging(對象發件人,GridViewPageEventArgs e)你將通過

protected void grdCourse_PageIndexChanging(object sender, GridViewPageEventArgs e) 
     { 
      Pagenum = e.NewPageIndex; 

      --call this method public DataSet GetCollegeSerachData(int PageNum,int PageSize,out int TotalRecords) 


     }