在使用 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 事件方法要記得加上去:PageIndexChanging、RowDataBound
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();
}
}