日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Web Form中的Datagrid的自定义分页

發(fā)布時間:2024/4/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Web Form中的Datagrid的自定义分页 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

ASP.NET帶給我們很多驚喜,強大的Web Form控件自然是其中的重要部分。這其中,最受關注的當然是Datagrid。在ASP中用HTML標記語法來輸出數(shù)據(jù)的方法在Datagrid數(shù)據(jù)綁定面前顯得如此繁雜。但是只使用Datagrid自身的功能,還是達不到實際的工作要求。本文就是給大家演示如何提高我們的工作效率、降低服務器的負載壓力。
1.?Datagrid的分頁顯示
當查
?????????????????????? 圖1 分頁設置
2.?自定義導航欄
在圖1的屬性頁中的"格式"欄中,我們可以設置"頁導航"的外觀樣式。但是很多程序設計人員都喜歡用自己定義的導航欄,而不使用默認的上下頁按鈕或數(shù)字按鈕(即出現(xiàn)1、2、3……頁號的形式)。那么我們可以這樣來做:
(1)?????? 如果要保留默認的導航欄,請不用看這一小節(jié)。如果要隱藏起默認的頁導航欄。就請將PageStyle的visible屬性設置為false。或在圖1"頁導航"中,不勾選"顯示導航按鈕"即可。
(2)?????? 在寫自定義導航欄時,主要是利用CurrentPageIndex屬性來設置頁:
"第一頁":
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)的編程方式,我們在自定義了導航欄按鈕的代碼后,需要再次加載Datagrid的數(shù)據(jù)源。否則將看不到頁切換的效果。也就是說,我們需要在按鈕的click事件中加入重新加載數(shù)據(jù)源的代碼,比如我們可以將加載的代碼寫在如下方法SetGridSource中,在按鈕Click的代碼最后加入SetGridSource()這句調用代碼。
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里的代碼,使瀏覽器在頁切換重置時可以重新加載并綁定Datagrid的數(shù)據(jù)源。要注意的是,上述代碼不能寫在首次加載判斷 if (!IsPostBack)語句中
(4) 在頁面上我們一般需要顯示總頁數(shù)與當前頁面這樣的信息。與WinForm中的Datagrid不同的是,在WinForm中需要獲取與數(shù)據(jù)相關的信息,只能從Datagrid的數(shù)據(jù)源,比如DataTable中去獲得數(shù)據(jù)行數(shù),某單元格的值等信息。被WinForm中的dataset與datagrid之間的關系弄得頭暈的朋友就不用再害怕了,在WebForm中,我們只要從Datagrid中就可以直接獲得這些信息了。總頁數(shù)是Datagrid的PageCount屬性;當前頁數(shù)是CurrentPageIndex屬性值+1來表示,這是由于CurrentPageIndex是從0開始計數(shù)的。
3.?自定義分頁
采用Datagrid屬性生成器中的分頁方式,我們都會感覺到方便的欣喜。但是,用上面所說的方法,每次頁切換時,都會用SELECT * FROM YOURTABLE這樣的SQl語句去提取出全部的數(shù)據(jù),而沒有任何與頁有關的篩選器。這大大降低了我們Web程序的效率,也增加了服務器的負擔。Datagrid提供的分頁特點也變得名不副實。我們希望分頁能真正的實現(xiàn)減少每次下載的數(shù)據(jù)量的功能,就要寫代碼控制住每次提取的數(shù)據(jù)量大小。
要使用自定義分頁,就要將 AllowCustomPaging 屬性設置為 true。然后基于 PageSize 和 VirtualItemCount 屬性的值計算要顯示 DataGrid 控件中每一項所需的頁數(shù)。
PageSize表示的是在 DataGrid 控件的單頁上顯示的項數(shù),默認值為10。
VirtualItemCount表示的是總數(shù)目。那么頁數(shù)自然是VirtualItemCount/PageSize
(1)?????? 當然是首先要知道一共有多少條數(shù)據(jù),然后我們才好進行分配,寫在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)在的形參有什么不同哦
}
注:這里說一個本文研究范圍之外的知識點,就是上面dr的賦值代碼中,我們用的是MyCommand.ExecuteReader(CommandBehavior.SingleRow),而大家一般用的只是MyCommand.ExecuteReader(),但請記住,如果返回記錄集只有一行的話,用CommandBehavior.SingleRow進行標識可以提高應用程序的執(zhí)行效率。這是因為不注明的一般情況下,MyCommand執(zhí)行是使用 IRowset 接口。而注明了之后,就會利用IRow 接口(如果可用)執(zhí)行綁定。其中的差別請關注筆者的后續(xù)作品。
(2)???????? 現(xiàn)在的主要變化當然在重新綁定數(shù)據(jù)源的方法SetGridSource中。我們給該方法加入兩個輸入參數(shù):當前的頁面、發(fā)出控制(即判斷用戶點擊的是"上一頁"還是"下一頁"等按鈕)。下面的代碼主要實現(xiàn)按鈕型導航欄,有兩個按鈕"上一頁"與"下一頁"。"第一頁"與"最后一頁"的寫法,請網友們自行實現(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字段的長度
????? 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ù)與內容。
請在按扭的click事件里的最后調用SetGridSource方法,參數(shù)
StartPosition= DataGrid1.CurrentPageIndex *DataGrid1.PageSize;
[參考]關于Datagrid分頁的更詳細的內容,可以參看華中科技大學出版社出版的章立民先生所著之《用實例學ASP.NET--使用VB.NET與ADO.NET》一書


?

總結

以上是生活随笔為你收集整理的Web Form中的Datagrid的自定义分页的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。