Web Form中的Datagrid的自定义分页
ASP.NET帶給我們很多驚喜,強(qiáng)大的Web Form控件自然是其中的重要部分。這其中,最受關(guān)注的當(dāng)然是Datagrid。在ASP中用HTML標(biāo)記語法來輸出數(shù)據(jù)的方法在Datagrid數(shù)據(jù)綁定面前顯得如此繁雜。但是只使用Datagrid自身的功能,還是達(dá)不到實(shí)際的工作要求。本文就是給大家演示如何提高我們的工作效率、降低服務(wù)器的負(fù)載壓力。
1.?Datagrid的分頁顯示
當(dāng)查
?????????????????????? 圖1 分頁設(shè)置
2.?自定義導(dǎo)航欄
在圖1的屬性頁中的"格式"欄中,我們可以設(shè)置"頁導(dǎo)航"的外觀樣式。但是很多程序設(shè)計(jì)人員都喜歡用自己定義的導(dǎo)航欄,而不使用默認(rèn)的上下頁按鈕或數(shù)字按鈕(即出現(xiàn)1、2、3……頁號(hào)的形式)。那么我們可以這樣來做:
(1)?????? 如果要保留默認(rèn)的導(dǎo)航欄,請(qǐng)不用看這一小節(jié)。如果要隱藏起默認(rèn)的頁導(dǎo)航欄。就請(qǐng)將PageStyle的visible屬性設(shè)置為false。或在圖1"頁導(dǎo)航"中,不勾選"顯示導(dǎo)航按鈕"即可。
(2)?????? 在寫自定義導(dǎo)航欄時(shí),主要是利用CurrentPageIndex屬性來設(shè)置頁:
"第一頁":
DataGrid1.CurrentPageIndex = 0;
"上一頁":
if (DataGrid1.CurrentPageIndex > 0)
DataGrid1.CurrentPageIndex -= 1;
"下一頁":
if (DataGrid1.CurrentPageIndex < (DataGrid1.PageCount - 1))
DataGrid1.CurrentPageIndex += 1;
"最后一頁":
DataGrid1.CurrentPageIndex = (DataGrid1.PageCount - 1);
(3)?????? 需要注意的是:Web Form是一種無狀態(tài)的編程方式,我們?cè)谧远x了導(dǎo)航欄按鈕的代碼后,需要再次加載Datagrid的數(shù)據(jù)源。否則將看不到頁切換的效果。也就是說,我們需要在按鈕的click事件中加入重新加載數(shù)據(jù)源的代碼,比如我們可以將加載的代碼寫在如下方法SetGridSource中,在按鈕Click的代碼最后加入SetGridSource()這句調(diào)用代碼。
private void SetGridSource()
{
SqlConnection MyConnection = new SqlConnection(YourOwnConnectionString);
string SelectCommand = "SELECT * FROM YOURTABLE";
SqlDataAdapter MyCommand = new SqlDataAdapter(SelectCommand, MyConnection);
DataSet ds = new DataSet();
MyCommand.Fill(ds, " YOURTABLE ");
DataView dv = ds.Tables["YOURTABLE "].DefaultView;
DataGrid1.DataSource = dv;
DataGrid1.DataBind();
}
或者我們可以在Page_load中寫入SetGridSource里的代碼,使瀏覽器在頁切換重置時(shí)可以重新加載并綁定Datagrid的數(shù)據(jù)源。要注意的是,上述代碼不能寫在首次加載判斷 if (!IsPostBack)語句中
(4) 在頁面上我們一般需要顯示總頁數(shù)與當(dāng)前頁面這樣的信息。與WinForm中的Datagrid不同的是,在WinForm中需要獲取與數(shù)據(jù)相關(guān)的信息,只能從Datagrid的數(shù)據(jù)源,比如DataTable中去獲得數(shù)據(jù)行數(shù),某單元格的值等信息。被WinForm中的dataset與datagrid之間的關(guān)系弄得頭暈的朋友就不用再害怕了,在WebForm中,我們只要從Datagrid中就可以直接獲得這些信息了。總頁數(shù)是Datagrid的PageCount屬性;當(dāng)前頁數(shù)是CurrentPageIndex屬性值+1來表示,這是由于CurrentPageIndex是從0開始計(jì)數(shù)的。
3.?自定義分頁
采用Datagrid屬性生成器中的分頁方式,我們都會(huì)感覺到方便的欣喜。但是,用上面所說的方法,每次頁切換時(shí),都會(huì)用SELECT * FROM YOURTABLE這樣的SQl語句去提取出全部的數(shù)據(jù),而沒有任何與頁有關(guān)的篩選器。這大大降低了我們Web程序的效率,也增加了服務(wù)器的負(fù)擔(dān)。Datagrid提供的分頁特點(diǎn)也變得名不副實(shí)。我們希望分頁能真正的實(shí)現(xiàn)減少每次下載的數(shù)據(jù)量的功能,就要寫代碼控制住每次提取的數(shù)據(jù)量大小。
要使用自定義分頁,就要將 AllowCustomPaging 屬性設(shè)置為 true。然后基于 PageSize 和 VirtualItemCount 屬性的值計(jì)算要顯示 DataGrid 控件中每一項(xiàng)所需的頁數(shù)。
PageSize表示的是在 DataGrid 控件的單頁上顯示的項(xiàng)數(shù),默認(rèn)值為10。
VirtualItemCount表示的是總數(shù)目。那么頁數(shù)自然是VirtualItemCount/PageSize
(1)?????? 當(dāng)然是首先要知道一共有多少條數(shù)據(jù),然后我們才好進(jìn)行分配,寫在Page_load里:
if (!IsPostBack)
{
StartIndex = 0;//StartIndex是int類型的公用變量
SqlConnection MyConnection = new SqlConnection(YourOwnConnectionString);
SqlCommand MyCommand = new SqlCommand("SELECT mycount = COUNT(*) FROM Table",MyConnection);
MyConnection.Open();
SqlDataReader dr = MyCommand.ExecuteReader(CommandBehavior.SingleRow);
if (dr.Read())
DataGrid1.VirtualItemCount = (int)dr["mycount"];
dr.Close();
MyConnection.Close();
SetGridSource(StartIndex, "上一頁");//看看現(xiàn)在的形參有什么不同哦
}
注:這里說一個(gè)本文研究范圍之外的知識(shí)點(diǎn),就是上面dr的賦值代碼中,我們用的是MyCommand.ExecuteReader(CommandBehavior.SingleRow),而大家一般用的只是MyCommand.ExecuteReader(),但請(qǐng)記住,如果返回記錄集只有一行的話,用CommandBehavior.SingleRow進(jìn)行標(biāo)識(shí)可以提高應(yīng)用程序的執(zhí)行效率。這是因?yàn)椴蛔⒚鞯囊话闱闆r下,MyCommand執(zhí)行是使用 IRowset 接口。而注明了之后,就會(huì)利用IRow 接口(如果可用)執(zhí)行綁定。其中的差別請(qǐng)關(guān)注筆者的后續(xù)作品。
(2)???????? 現(xiàn)在的主要變化當(dāng)然在重新綁定數(shù)據(jù)源的方法SetGridSource中。我們給該方法加入兩個(gè)輸入?yún)?shù):當(dāng)前的頁面、發(fā)出控制(即判斷用戶點(diǎn)擊的是"上一頁"還是"下一頁"等按鈕)。下面的代碼主要實(shí)現(xiàn)按鈕型導(dǎo)航欄,有兩個(gè)按鈕"上一頁"與"下一頁"。"第一頁"與"最后一頁"的寫法,請(qǐng)網(wǎng)友們自行實(shí)現(xiàn)。在如下示例中,column1為數(shù)據(jù)表之主鍵。每頁有5行數(shù)據(jù)。
private void SetGridSource (int StartPosition, string GoToPage)
{
?SqlConnection MyConnection = new? SqlConnection(YourOwnConnectionString);
?SqlCommand MyCommand = null;
?switch (GoToPage)
?{
? case "上一頁":
????? MyCommand = new
???????? SqlCommand("SELECT TOP 5 * FROM Table WHERE column1 >= @ID ORDER BY column1",MyConnection);
????? if (StartPosition == 0)
??????? MyCommand.Parameters.Add("@ID",SqlDbType.NVarChar, 10).Value = "";//這里參數(shù)10是ID字段的長(zhǎng)度
????? else
??????? MyCommand.Parameters.Add("@ID",SqlDbType.NVarChar,10).Value =
??????????????? ViewState[(DataGrid1.CurrentPageIndex + 1).ToString()];
break;
? case "下一頁":
????? MyCommand = new
???????? SqlCommand("SELECT TOP 5 * FROM Table WHERE column1 > @ID ORDER BY column1",MyConnection);//注意:這里用的是>,不是>=喲
????? MyCommand.Parameters.Add("@ID", SqlDbType.NVarChar,10).Value = DataGrid1.Items[4].Cells[0].Text;//Items[4]表示第5行即每頁顯示的最后一行
????? break;
?}
?MyConnection.Open();
?SqlDataReader dr = MyCommand.ExecuteReader();
?DataGrid1.DataSource = dr;
?DataGrid1.DataBind();
?dr.Close();
?MyConnection.Close();
? //用ViewState來緩存剛才訪問過的那一頁的第一行中的主鍵值
?ViewState[(DataGrid1.CurrentPageIndex + 1).ToString()]=DataGrid1.Items[0].Cells[0].Text;
}
注:如果是oracle數(shù)據(jù)庫,可以在where條件中用rownum來控制上下頁的條數(shù)與內(nèi)容。
請(qǐng)?jiān)诎磁さ腸lick事件里的最后調(diào)用SetGridSource方法,參數(shù)
StartPosition= DataGrid1.CurrentPageIndex *DataGrid1.PageSize;
[參考]關(guān)于Datagrid分頁的更詳細(xì)的內(nèi)容,可以參看華中科技大學(xué)出版社出版的章立民先生所著之《用實(shí)例學(xué)ASP.NET--使用VB.NET與ADO.NET》一書
?
總結(jié)
以上是生活随笔為你收集整理的Web Form中的Datagrid的自定义分页的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 团队组建阶段,项目经理要做些什么?
- 下一篇: 遥想当年年纪小,追风逐浪没烦恼