到目前為止,我?guī)缀踉诿恳粋€(gè)我參加過的商業(yè)c#.net工程中使用了datagrid控件;因此,當(dāng)我第一次聽到有關(guān)于gridview是如何提高工作效率時(shí),我飛快地試用了它。datagrid和gridview都是asp.net 2.0中提供的新的控件類,它們?cè)试S你快速容易地顯示表格式數(shù)據(jù);并且當(dāng)在線觀看它們時(shí),它們都能被轉(zhuǎn)換為客戶端html表格進(jìn)行顯示。
一. 簡(jiǎn)介
  這是系列文章的第一篇。在本篇中,我們將通過一個(gè)簡(jiǎn)單的網(wǎng)上商店示例程序來集中討論gridview控件的一些用法。注意,在每一篇文章中我們都使用相同的源文件。為了觀察本文示例演示效果,你只需要把下載內(nèi)容解壓到你的web服務(wù)器上一個(gè)新的目錄并瀏覽到該目錄名即可。例如,如果你把所有的內(nèi)容解壓到一個(gè)你的web服務(wù)器根目錄下的目錄"gridviewshop",并導(dǎo)航到這個(gè)目錄:
http://www.yourserver.com/gridviewshop
  如果一切順利,那么你應(yīng)該會(huì)看到一個(gè)如下圖1所示的站點(diǎn):
圖1.本系列文章網(wǎng)上商店演示程序快照。
  二. gridview
  如果你已經(jīng)使用datagrid實(shí)現(xiàn)了你的系統(tǒng),包括你自己的定制分頁(yè)與排序方案,那么,你真正不需要考慮更新到gridview;因?yàn)閺慕K端效果來看,它們都生成相同的內(nèi)容(都生成一個(gè)html表格)。然而,如果你剛開始開發(fā)一個(gè)新的系統(tǒng),那么,我建議你使用gridview,特別是如果你想利用它內(nèi)置的分頁(yè)與排序功能的話。
  通過在設(shè)計(jì)時(shí)刻設(shè)置各種屬性,你可以控制gridview從外觀到功能等若干方面。在本系列文章后面,我們將會(huì)更為深入地探討這些方面,通過把一些css類指派給表格行和表格列頭;當(dāng)然,還要添加一些事件處理器以便允許用戶與每一行數(shù)據(jù)進(jìn)行交互。
  填充gridview類似于填充一個(gè)datagrid。你只需創(chuàng)建datasource,然后使用如下代碼把它綁定到gridview即可:mygridview.datasource = yourdatasource; 
mygridview.databind();
  當(dāng)然,借助于.net 2.0,你還有另一種選擇,那就是創(chuàng)建一個(gè)sqldatasource并把gridview直接綁定到其上。這是通過設(shè)置它的datasourceid以匹配你指派給sqldatasource的id實(shí)現(xiàn)的,即是:<!--使用mysqldatasource的id創(chuàng)建sqldatasource--> 
<asp:sqldatasource
id="mysqldatasource"
runat="server"
datasourcemode="datareader"
connectionstring="<%$ connectionstrings:mynorthwind%>"
selectcommand="select lastname from employees">
</asp:sqldatasource>
<!--創(chuàng)建gridview并且指派它的datasourceid以匹配上面的mysqldatasource-->
<asp:gridview
id="mygridview"
runat="server"
autogeneratecolumns="true"
datasourceid="mysqldatasource"/>
  作為個(gè)人,我并不太看重這種方法,盡管它是微軟推薦的建立你的gridview的方法。我比較喜歡更多地控制我的datasource;因?yàn)椋@樣以來我能夠手工過濾它的內(nèi)容甚至更多,這也正是為什么我在這個(gè)商店演示程序中沒有使用這個(gè)方法的原因。
  好,下面讓我們繼續(xù)討論構(gòu)建本文中的商店演示程序。其大致情況是,在一個(gè)頁(yè)面上存在兩個(gè)gridviews;你在前面已經(jīng)看到這個(gè)圖像。一個(gè)gridview用于顯示我們的商店的產(chǎn)品,而其它的內(nèi)容對(duì)應(yīng)于購(gòu)物籃。你能夠容易地把這兩部分拆分到它們各自的頁(yè)面中,但是為了簡(jiǎn)化起見,我們把這些內(nèi)容放到了一起。
  如果你打開default.aspx(它包括在本文相應(yīng)的zip源碼文件中),你能夠看到這個(gè)頁(yè)面是如何建立的。大多數(shù)html僅僅用于實(shí)現(xiàn)包裝之目的;需要注意的是,位于頁(yè)面頂部的聲明以及主<form>標(biāo)簽和位于其內(nèi)的<gridview>標(biāo)簽。
  三. 頁(yè)面聲明<%@ page inherits="shop.site" src="cs/site.aspx.cs" %> 
  該頁(yè)面聲明簡(jiǎn)單地告訴我們的頁(yè)面它屬于什么命名空間和類。在這個(gè)例子中,我們的命名空間是"shop"而我們的類是"site"。還存在一個(gè)稱為"src"的額外屬性定義,它指向包含該站點(diǎn)類的普通的.cs文本文件。
  我通常在開發(fā)期間,把我的類放在外部.cs文件中,并把它們手工地編譯成.dll文件。當(dāng)我使用visual studio時(shí),在開發(fā)期間,我總是習(xí)慣使用預(yù)編譯的dll,因?yàn)樯院螅恍枰粋€(gè)簡(jiǎn)單的構(gòu)建即可以生成它們。一旦我完成了相應(yīng)的工作,我都會(huì)把該類構(gòu)建成預(yù)編譯的dll;但是,在開發(fā)期間,我比較喜歡把較多的時(shí)間花費(fèi)在編碼方面而不是編譯上。 
四. 構(gòu)建數(shù)據(jù)
| <asp:gridview id="gvbasket" autogeneratecolumns="false" showheader="true" showfooter="true" datakeynames="id" onrowdatabound="gvbasket_rowdatabound" runat="server"> <columns> <asp:imagefield dataimageurlfield="thumb" alternatetext="product thumbnail" readonly="true" /> <asp:templatefield headertext="item"> <itemtemplate> <h3><asp:literal id="lititemname" runat="server" /></h3> </itemtemplate> <footertemplate> <a href="delivery-costs.aspx" title="view the list of delivery charges">delivery charges</a> <br /><hr /> <b>total</b> </footertemplate> </asp:templatefield> </columns> </asp:gridview> | 
| protected void gvbasket_rowdatabound(object sender, gridviewroweventargs e) { switch( e.row.rowtype ) { case datacontrolrowtype.datarow: //名稱/描述 ((literal)e.row.findcontrol("lititemname")).text = convert.tostring(((datarowview)e.row.dataitem)["name"]); //數(shù)量 string quantity = convert.tostring(((datarowview)e.row.dataitem)["quantity"]); ((htmlinputtext)e.row.findcontrol("itproductquantity")).value = quantity; //價(jià)格 ((literal)e.row.findcontrol("litprice")).text = string.format("{0:c2}", convert.todouble(((datarowview)e.row.dataitem)["price"]) * convert.toint32(quantity)); break; case datacontrolrowtype.footer: datatable dtshop = getbasketdt(); double total = 0.00; for(int i = 0; i < dtshop.rows.count; i++) { total += convert.toint32(dtshop.rows[i]["quantity"]) * convert.todouble(dtshop.rows[i]["price"]); } ((literal)e.row.findcontrol("littotalquantity")).text = convert.tostring(dtshop.compute("sum(quantity)", "")); ((literal)e.row.findcontrol("litdeliveryprice")).text = string.format("{0:c2}", convert.todouble(calcdeliverycost(total))); ((literal)e.row.findcontrol("littotalprice")).text = string.format("{0:c2}", convert.todouble(calcdeliverycost(total)) + total); break; } } | 
新聞熱點(diǎn)
疑難解答
圖片精選