ASP.NET中為DataGrid添加合計字段
論壇中最常見的一個問題是:“我怎樣在DataGrid中顯示列合計?”。我親自多次為這個問題提供了示例代碼,因此,我想在DotNetJunkies的標題中提供這麼一份指南。在這份指南中你將會學到怎樣在DataGrid中編程實現對某一列的值進行統計,並在DataGrid的頁腳中顯示其合計值。這份指南中供下載的示例中包括了C#和VisualBasic.NET兩種代碼。
這份指南的最終結果看起來像這樣:
從上圖可看出:
上麵所用到的屏幕圖片中的DataGrid是一個非常典型的DataGrid。有許多控製DataGrid外觀的屬性,它使用兩個BoundColumns來操作數據,但這並不是最重要的。做好這項工作真正重要的是使用DataGrid.OnItemDataBound事件。這個事件將會觸發每次綁定一條記錄到DataGrid。你可以為這個事件創建一個事件處理,以操作數據記錄。在這種情況下,你將會得到運行時Price列的合計值。
頁腳指的是數據範圍的最後一行。當這行被限定時,在事件句處理你可以得到Price列的運行時統計值。
實施:
首先讓我們找到一種方法來操作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列。
忽略代碼的定義
類代碼在所有的地方都將使用。在類代碼中,你可以操作兩個事件: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列中運行時統計的雙精度值。
Page_Load事件
在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());
}
}
CalcTotals方法
CalcTotals方法用來處理runningTotal變量。這個值將以字符串形式來傳遞。你需要將它解析為雙精度型,然後runningTotal變量就成了雙精度類型。
privatevoidCalcTotal(string_price)
{
try
{
runningTotal+=Double.Parse(_price);
}
catch
{
//捕獲錯誤
}
}
MyGrid_ItemDataBound事件
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。
總結
在這份指南中,你學到了怎樣使用DataGrid.OnItemDataBound事件來實現運行時對DataGrid的某一列進行統計。使用這個事件,你可以創建一個列的合計並可對DataGrid行的頁腳進行著色。
最後更新:2017-04-02 00:06:36
上一篇:
ASP.NET Web Page應用深入探討
下一篇:
使用遊戲引擎實現的水波紋
Adobe鮮為人知的身份:全球第二大雲端服務商
國內首套免費的《Nutch相關框架視頻教程》(1-16)
c語言基礎(六)之類型
React全家桶與前端單元測試藝術
移動測試-金融行業解決方案
eclipse如何導入javax.servlet.*
Java常用類庫--StringBuffer:append、insert、reverse、replace、subString、delete、indexOf
Linux Eclipse代碼提示功能設置(Java & C/C++)
Struts中<s:checkboxlist>的用法
【圖文】雲棲大會深圳峰會:阿裏雲ET醫療大腦與工業大腦,機器學習平台PAI2.0