GridView 換頁問題

在使用 GridView 控制項時,一般我們會用來呈現資料庫的表格資料,常使用的方法

可以透過 SqlConnection 來連到資料庫,利用 SqlDataReader() 的方法來綁定 GridView ,

不過這樣子在切換頁面時,會出現分頁錯誤的狀況。

假設在畫面上,放一個 GirdView 控制項,透過資料庫連線來顯示出 Table 的資料,後端程式碼如下:

 SqlConnection conn = new SqlConnection
           (WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);

            conn.Open();
            string str = "";
            str = "select * from [TableName]";
            SqlCommand cmd = new SqlCommand(str, conn);
            SqlDataReader sdr = cmd.ExecuteReader();
          
            GridView1.DataSource = sdr;
            GridView1.DataBind();

            cmd.Cancel();
            conn.Dispose();
            conn.Close();

這樣子的寫法當我在執行時,資料可以呈現在 GridView 上,單純的顯示而已沒問題,但是當我要切換頁面的話,就會出現錯誤,

(如圖所示)  "資料來源不支援伺服器端的資料分頁"

原因在於因為 DataReader 是連線型的,抓取資料的過程是直接連結資料庫;而像是 DataTable, DataSet 是離線型的,將相關資料

抓取完後放在 DataTable 或是 DataSet 的 DataTable 中,所以今天要做 分頁 的功能,內建的分頁從已經撈出來的資料(DataTable)中,

再次抓取要顯示的資料到 DataView 中。

更正後為:

SqlConnection conn = new SqlConnection
           (WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);

            conn.Open();
            string str = "";
            str = "select * from [TableName]";
            SqlCommand cmd = new SqlCommand(str, conn);
            SqlDataReader sdr = cmd.ExecuteReader();

            DataTable dt = new DataTable(); //使用DataTable來儲存資料
            dt.Load(sdr);
            GridView1.DataSource = dt.AsDataView();
            GridView1.DataBind();

            cmd.Cancel();
            conn.Dispose();
            conn.Close();

另外,有兩個 GridView 事件方法要記得加上去:PageIndexChangingRowDataBound

 protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            GridView1.PageIndex = e.NewPageIndex;
            GridView1.DataBind();
        }
        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                e.Row.Cells[0].Text = (e.Row.RowIndex + 1).ToString();
            }
        }