天天看點

ASP.NET中為DataGrid添加合計字段

論壇中最常見的一個問題是:“我怎樣在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的代碼:

&lt;?xml:namespaceprefix =asp /&gt;&lt;?xml:namespace prefix = asp /&gt;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"&gt;

="title"headertext="title"&gt;

itemstyle-horizontalalign="right"

headerstyle-horizontalalign="center"/&gt;

=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值&gt;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&gt;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行的頁腳進行着色。

繼續閱讀