none
該如何撰寫Gridview的分頁功能呢? RRS feed

  • 問題

  • 想請教一下,當我透過gridview.datasource指定來源資料後,並在gridview的屬性裡設定allowpaging=true,pagesize=4,但當我檢視資料後,在按下第2頁或其他頁前,都會出現錯誤訊息:由 GridView 'GridView1' 引發但尚未處理的事件 PageIndexChanging

    由於我是自行撰寫ado.net的datasource,非sqldatasource的方式

    所以想請教該如何正確撰寫gridview的分頁功能呢?

    感謝您的回答~~~

     

    2006年8月10日 上午 02:44

解答

  • 先在 Page_Load

     protected void Page_Load(object sender, EventArgs e)
        {   

            if (!Page.IsPostBack)
            {

              // Ado.NET 的副程式
                BindGridView();
        
            }
        }

      protected void gvNewsList_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            gvNewsList.PageIndex =  e.NewPageIndex;
            BindGridView();
        }
        public void BindGridView()
        {        
            DataSet dsData = New DataSet() ; // 這邊就是你叫資料的給 DataTable or Dataset 的程式

             SqlDataAdapter sqlDA = new SqlDataAdapter(strCmd, sqlConn);
            sqlDA.Fill(dsData, "Data");

            gvNewsList.DataSource = dsData.Table["Data"];
            gvNewsList.DataBind();
        }

    2006年8月10日 上午 03:27

所有回覆

  • 先在 Page_Load

     protected void Page_Load(object sender, EventArgs e)
        {   

            if (!Page.IsPostBack)
            {

              // Ado.NET 的副程式
                BindGridView();
        
            }
        }

      protected void gvNewsList_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            gvNewsList.PageIndex =  e.NewPageIndex;
            BindGridView();
        }
        public void BindGridView()
        {        
            DataSet dsData = New DataSet() ; // 這邊就是你叫資料的給 DataTable or Dataset 的程式

             SqlDataAdapter sqlDA = new SqlDataAdapter(strCmd, sqlConn);
            sqlDA.Fill(dsData, "Data");

            gvNewsList.DataSource = dsData.Table["Data"];
            gvNewsList.DataBind();
        }

    2006年8月10日 上午 03:27
  • 有個疑問, ASP.NET的GridView不是會自動在換頁時重新設定GridView的PageIndex

    ,為什麼以程式的方式必須自己設定GridView.PageIndex且在設定後重新Bind呢?謝謝!

    2006年11月14日 上午 03:23
  • 原因很簡單,因為 ASP.NET 不會自動幫你記住任何東西,你要明白的告訴它 .
    2006年11月14日 上午 03:34
    版主
  • 請問一下,你這種方法我大致試過,

    如上例

    透過e.NewPageIndex得到目前頁次

    再透過 BindGridView() 取回該頁面的資料列  (假設是 15筆)

    BUT!!!!!

    透過這樣的方式,我取到了第N頁的資料 然後 DataBind()起來!!!!

    結果 原來的頁次就沒了!!!!!

    因為在BindGridView()我只取出第N頁的資料

    這怎麼又該解決??? 我要原本頁次連結還在 同時又正確取得選擇頁次資料!!!!!


    2009年4月22日 上午 08:37
  • 請問一下,你這種方法我大致試過,

    如上例

    透過e.NewPageIndex得到目前頁次

    再透過 BindGridView() 取回該頁面的資料列  (假設是 15筆)

    BUT!!!!!

    透過這樣的方式,我取到了第N頁的資料 然後 DataBind()起來!!!!

    結果 原來的頁次就沒了!!!!!

    因為在BindGridView()我只取出第N頁的資料

    這怎麼又該解決??? 我要原本頁次連結還在 同時又正確取得選擇頁次資料!!!!!



    可以把DataSet設為Static  Ds_Static ,之後Bind不要再重新連線,

    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
            gvNewsList.PageIndex =  e.NewPageIndex;

            直接GridView1.DataSource = Ds_Static ;

            GridView1.DataBind() ;

    }

    依資料大小~若太大不建議,因為會很占ram
    2011年3月23日 上午 07:02
  • static通常不是這樣用的...

    如果這樣寫,有很多連線進來同一頁,可能會取到同一份資料或相互影響。


    常用資源參考:
    小弟的blog: In 91,wiki: my wiki
    2011年3月23日 上午 07:47
    版主
  • 如同您所說的「我是自行撰寫ado.net的datasource,非sqldatasource的方式」

    小弟剛好有一些完整範例,跟您要求的一樣。

    自己動手寫 GridView的分頁、排序、刪除、編輯(更新)等等

    希望對您有幫助。   (ADO.NET的部分,您可以自己修改。但原理是一樣的。)

     

    VB語法 -- http://www.dotblogs.com.tw/mis2000lab/archive/2008/09/15/5377.aspx

    C#語法 -- http://www.dotblogs.com.tw/mis2000lab/archive/2010/10/22/ado_net_gridview_sqldatasource_manual_coding.aspx

     

    自己動手寫 GridView排序

    http://www.dotblogs.com.tw/mis2000lab/archive/2009/11/04/gridview_sorting_20091104.aspx

     


    我的書 與 ASP.NET教學網站 http://www.dotblogs.com.tw/mis2
    2011年3月23日 上午 09:33

  • 透過這樣的方式,我取到了第N頁的資料 然後 DataBind()起來!!!!

    結果 原來的頁次就沒了!!!!!

    因為在BindGridView()我只取出第N頁的資料

    這怎麼又該解決??? 我要原本頁次連結還在 同時又正確取得選擇頁次資料!!!!!

    您可能要注意一下 e.NewPageIndex是 GridViewPageEventArgs

     

    protected void gvNewsList_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
    gvNewsList.PageIndex = e.NewPageIndex;
    BindGridView();
    }

    是 User點選 Gridview頁數

    如果您要保留「原本頁數」,就應該自己做紀錄,例如透過 Session,而不是依賴e.NewPageIndex

     

     

    另外,這是我自己寫的分頁功能。不知道對您有無幫助?

    http://www.dotblogs.com.tw/mis2000lab/archive/2010/11/30/datareader_paging_row_number.aspx



    我的書 與 ASP.NET教學網站 http://www.dotblogs.com.tw/mis2000lab/
    2011年3月23日 上午 09:38