論壇中最常見的一個問題是:“我怎樣在datagrid中顯示列合計?”。我親自多次為這個問題提供了示例代碼,是以,我想在dotnetjunkies的标題中提供這麼一份指南。在這份指南中你将會學到怎樣在datagrid中程式設計實作對某一列的值進行統計,并在datagrid的頁腳中顯示其合計值。這份指南中供下載下傳的示例中包括了c#和visualbasic.net兩種代碼。
這份指南的最終結果看起來像這樣:
從上圖可看出:
上面所用到的螢幕圖檔中的datagrid是一個非常典型的datagrid。有許多控制datagrid外觀的屬性,它使用兩個boundcolumns來操作資料,但這并不是最重要的。做好這項工作真正重要的是使用datagrid.onitemdatabound事件。這個事件将會觸發每次綁定一條記錄到datagrid。你可以為這個事件建立一個事件處理,以操作資料記錄。在這種情況下,你将會得到運作時price列的合計值。
頁腳指的是資料範圍的最後一行。當這行被限定時,在事件句處理你可以得到price列的運作時統計值。
<b>實施</b>:
首先讓我們找到一種方法來操作web窗體輸出。這份指南中,你将使用一個web窗體(calctotals.aspx)以及一個類代碼檔案(calctotals.aspx.cs)。這份指南的意圖是,類代碼将會使用just-in-time編譯器來編譯。這裡是calctotals.aspx的代碼:
<?xml:namespaceprefix =asp /><?xml:namespace prefix = asp />autogeneratecolumns="false"
cellpadding="4"cellspacing="0"
borderstyle="solid"borderwidth="1"
gridlines="none"bordercolor="black"
itemstyle-font-name="verdana"
itemstyle-font-size="9pt"
headerstyle-font-name="verdana"
headerstyle-font-size="10pt"
headerstyle-font-bold="true"
headerstyle-forecolor="white"
headerstyle-backcolor="blue"
footerstyle-font-name="verdana"
footerstyle-font-size="10pt"
footerstyle-font-bold="true"
footerstyle-forecolor="white"
footerstyle-backcolor="blue"
onitemdatabound="mydatagrid_itemdatabound"
showfooter="true">
="title"headertext="title">
itemstyle-horizontalalign="right"
headerstyle-horizontalalign="center"/>
=mygrid
在web窗體中你使用@page來直接聲明這個頁所繼承的類代碼。src屬性指明了類代碼将使用jit編譯器來編譯。web窗體中的大部分代碼樣式聲明用來使datagrid外觀變得更好看。
最後指定的屬性之一是onitemdatabound屬性。這個事件将會在onitemdatabound事件發生時被觸發。
web窗體中的datagrid(mygrid)包含有兩個boundcolumns,一個是title,另一個是price。這裡将顯示pubs資料庫(sqlserver)中titles表的title及price列。
<b>忽略代碼的定義</b>
類代碼在所有的地方都将使用。在類代碼中,你可以操作兩個事件:page_load事件以及mygrid_onitemdatabound事件。還有一個私有方法calctotal,用它來簡單的完成運作時統計的數學運算。
類代碼基本結構塊的起始部分:
usingsystem;
usingsystem.web;
usingsystem.web.ui;
usingsystem.web.ui.webcontrols;
usingsystem.web.ui.htmlcontrols;
usingsystem.data;
usingsystem.data.sqlclient;
namespacemyapp
{
publicclasscalctotals:page
{
protecteddatagridmygrid;
privatedoublerunningtotal=0;
}
}
在類代碼的基本結構中,你必須使用相關語句導入名字空間(namespace)。在類聲明中,你聲明了兩個變量,一個是類代碼中映射web窗體的datagrid(mygrid)控件的變量;一個是用來操作datagrid的price列中運作時統計的雙精度值。
<b>page_load事件</b>
在page_load事件中,你所要做的就是連接配接到sqlserver并執行一個簡單的sqlcommand。你取得了所有price值>0的title和price資料。你使用sqlcommand.executereader方法傳回一個sqldatareader并将其直接綁定到datagrid(mygrid)。
protectedvoidpage_load(objectsender,eventargse)
sqlconnectionmyconnection=newsqlconnection("server=localhost;database=pubs;uid=sa;pwd=;");//建立sql連接配接
sqlcommandmycommand=newsqlcommand("selecttitle,pricefromtitleswhereprice>0",myconnection);//建立sql指令
try
myconnection.open();//打開資料庫連接配接
mygrid.datasource=mycommand.executereader();//指定datagrid的資料源
mygrid.databind();//綁定資料到datagrid
myconnection.close();//關閉資料連接配接
catch(exceptionex)
//捕獲錯誤
httpcontext.current.response.write(ex.tostring());
<b>calctotals方法</b>
calctotals方法用來處理runningtotal變量。這個值将以字元串形式來傳遞。你需要将它解析為雙精度型,然後runningtotal變量就成了雙精度類型。
privatevoidcalctotal(string_price)
runningtotal+=double.parse(_price);
catch
<b> mygrid_itemdatabound事件</b>
mygrid_itemdatabound事件在資料源中每行綁定到datagrid時被調用。在這個事件進行中,你可以處理每一行資料。這裡你的目的是,你将需要調用calctotals方法并從price列傳遞文本,并用金額型格式化每一行的price列,并在頁腳行中顯示runningtotal的值。
publicvoidmydatagrid_itemdatabound(objectsender,datagriditemeventargse)
if(e.item.itemtype==listitemtype.item||e.item.itemtype==listitemtype.alternatingitem)
calctotal(e.item.cells[1].text);
e.item.cells[1].text=string.format("{0:c}",convert.todouble(e.item.cells[1].text));
elseif(e.item.itemtype==listitemtype.footer)
e.item.cells[0].text="total";
e.item.cells[1].text=string.format("{0:c}",runningtotal);
在mygrid_itemdatabound事件句柄中,首先你得使用listitemtype判斷目前的datagriditem是一個資料項還是alternatingitem行。如果是資料項,你調用calctotals,并将price列的值作為參數傳遞給它;然後你以金額格式對price列進行格式化及着色。
如果datagriditem是頁腳,可以用金額格式顯示runningtotal。
<b>總結</b>
在這份指南中,你學到了怎樣使用datagrid.onitemdatabound事件來實作運作時對datagrid的某一列進行統計。使用這個事件,你可以建立一個列的合計并可對datagrid行的頁腳進行着色。