ASP.NET中為DataGrid添加合計字段
更新時間:2006年09月28日 00:00:00 作者:
論壇中最常見的一個問題是:“ 我怎樣在 DataGrid 中顯示列合計?”。 我親自多次為這個問題提供了示例代碼,因此,我想在DotNetJunkies 的標(biāo)題中提供這么一份指南。 在這份指南中你將會學(xué)到怎樣在 DataGrid 中編程實(shí)現(xiàn)對某一列的值進(jìn)行統(tǒng)計,并在 DataGrid 的頁腳中顯示其合計值。這份指南中供下載的示例中包括了 C# 和 Visual Basic.NET 兩種代碼。
這份指南的最終結(jié)果看起來像這樣:
從上圖可看出:
上面所用到的屏幕圖片中的 DataGrid 是一個非常典型的 DataGrid 。有許多控制 DataGrid 外觀的屬性,它使用兩個 BoundColumns 來操作數(shù)據(jù),但這并不是最重要的。做好這項(xiàng)工作真正重要的是使用 DataGrid.OnItemDataBound 事件。這個事件將會觸發(fā)每次綁定一條記錄到 DataGrid。你可以為這個事件創(chuàng)建一個事件處理,以操作數(shù)據(jù)記錄。在這種情況下,你將會得到運(yùn)行時 Price 列的合計值。
頁腳指的是數(shù)據(jù)范圍的最后一行。當(dāng)這行被限定時,在事件句處理你可以得到 Price 列的運(yùn)行時統(tǒng)計值。
實(shí)施:
首先讓我們找到一種方法來操作 Web 窗體輸出。 這份指南中,你將使用一個 Web 窗體 (calcTotals.aspx) 以及一個類代碼文件 (calcTotals.aspx.cs)。這份指南的意圖是, 類代碼將會使用 Just-In-Time 編譯器來編譯。 這里是 calcTotals.aspx 的代碼:
在 Web 窗體中你使用 @ Page 來直接聲明這個頁所繼承的類代碼。SRC 屬性指明了類代碼將使用 JIT 編譯器來編譯。 Web 窗體中的大部分代碼樣式聲明用來使 DataGrid 外觀變得更好看。
最后指定的屬性之一是 OnItemDataBound 屬性。這個事件將會在 OnItemDataBound 事件發(fā)生時被觸發(fā)。
Web 窗體中的 DataGrid (MyGrid) 包含有兩個 BoundColumns,一個是 Title ,另一個是Price。 這里將顯示 Pubs 數(shù)據(jù)庫(SQL Server)中 Titles 表的 title 及 price 列。
忽略代碼的定義
類代碼在所有的地方都將使用。在類代碼中,你可以操作兩個事件:Page_Load 事件以及 MyGrid_OnItemDataBound 事件。還有一個私有方法 CalcTotal, 用它來簡單的完成運(yùn)行時統(tǒng)計的數(shù)學(xué)運(yùn)算。
類代碼基本結(jié)構(gòu)塊的起始部分:
在類代碼的基本結(jié)構(gòu)中,你必須使用相關(guān)語句導(dǎo)入名字空間(namespace)。在類聲明中,你聲明了兩個變量,一個是類代碼中映射 Web 窗體的 DataGrid(MyGrid)控件的變量;一個是用來操作 DataGrid 的 Price 列中運(yùn)行時統(tǒng)計的雙精度值。
Page_Load 事件
在 Page_Load 事件中,你所要做的就是連接到 SQL Server 并執(zhí)行一個簡單的 SqlCommand。 你取得了所有 Price 值>0 的 title 和 price 數(shù)據(jù)。你使用 SqlCommand.ExecuteReader 方法返回一個 SqlDataReader 并將其直接綁定到 DataGrid (MyGrid)。
CalcTotals 方法
CalcTotals 方法用來處理 runningTotal 變量。這個值將以字符串形式來傳遞。 你需要將它解析為雙精度型,然后 runningTotal 變量就成了雙精度類型。
MyGrid_ItemDataBound 事件
MyGrid_ItemDataBound 事件在數(shù)據(jù)源中每行綁定到 DataGrid 時被調(diào)用。在這個事件處理中,你可以處理每一行數(shù)據(jù)。 這里你的目的是,你將需要調(diào)用 CalcTotals 方法并從 Price 列傳遞文本,并用金額型格式化每一行的 Price 列, 并在頁腳行中顯示 runningTotal 的值。
在 MyGrid_ItemDataBound 事件句柄中,首先你得使用 ListItemType 判斷當(dāng)前的 DataGridItem 是一個數(shù)據(jù)項(xiàng)還是AlternatingItem 行。如果是數(shù)據(jù)項(xiàng),你調(diào)用 CalcTotals,并將 Price 列的值作為參數(shù)傳遞給它;然后你以金額格式對 Price 列進(jìn)行格式化及著色。
如果 DataGridItem 是頁腳,可以用金額格式顯示 runningTotal。
總結(jié)
在這份指南中,你學(xué)到了怎樣使用 DataGrid.OnItemDataBound 事件來實(shí)現(xiàn)運(yùn)行時對DataGrid 的某一列進(jìn)行統(tǒng)計。使用這個事件,你可以創(chuàng)建一個列的合計并可對DataGrid行的頁腳進(jìn)行著色。
這份指南的最終結(jié)果看起來像這樣:
![]() |
從上圖可看出:
上面所用到的屏幕圖片中的 DataGrid 是一個非常典型的 DataGrid 。有許多控制 DataGrid 外觀的屬性,它使用兩個 BoundColumns 來操作數(shù)據(jù),但這并不是最重要的。做好這項(xiàng)工作真正重要的是使用 DataGrid.OnItemDataBound 事件。這個事件將會觸發(fā)每次綁定一條記錄到 DataGrid。你可以為這個事件創(chuàng)建一個事件處理,以操作數(shù)據(jù)記錄。在這種情況下,你將會得到運(yùn)行時 Price 列的合計值。
頁腳指的是數(shù)據(jù)范圍的最后一行。當(dāng)這行被限定時,在事件句處理你可以得到 Price 列的運(yùn)行時統(tǒng)計值。
實(shí)施:
首先讓我們找到一種方法來操作 Web 窗體輸出。 這份指南中,你將使用一個 Web 窗體 (calcTotals.aspx) 以及一個類代碼文件 (calcTotals.aspx.cs)。這份指南的意圖是, 類代碼將會使用 Just-In-Time 編譯器來編譯。 這里是 calcTotals.aspx 的代碼:
<%@ Page Inherits="myApp.calcTotals" Src="20010731T0101.aspx.cs" %> 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"> HeaderStyle-HorizontalAlign="Center" /> |
在 Web 窗體中你使用 @ Page 來直接聲明這個頁所繼承的類代碼。SRC 屬性指明了類代碼將使用 JIT 編譯器來編譯。 Web 窗體中的大部分代碼樣式聲明用來使 DataGrid 外觀變得更好看。
最后指定的屬性之一是 OnItemDataBound 屬性。這個事件將會在 OnItemDataBound 事件發(fā)生時被觸發(fā)。
Web 窗體中的 DataGrid (MyGrid) 包含有兩個 BoundColumns,一個是 Title ,另一個是Price。 這里將顯示 Pubs 數(shù)據(jù)庫(SQL Server)中 Titles 表的 title 及 price 列。
忽略代碼的定義
類代碼在所有的地方都將使用。在類代碼中,你可以操作兩個事件:Page_Load 事件以及 MyGrid_OnItemDataBound 事件。還有一個私有方法 CalcTotal, 用它來簡單的完成運(yùn)行時統(tǒng)計的數(shù)學(xué)運(yùn)算。
類代碼基本結(jié)構(gòu)塊的起始部分:
using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Data; using System.Data.SqlClient; namespace myApp { public class calcTotals : Page { protected DataGrid MyGrid; private double runningTotal = 0; } } |
在類代碼的基本結(jié)構(gòu)中,你必須使用相關(guān)語句導(dǎo)入名字空間(namespace)。在類聲明中,你聲明了兩個變量,一個是類代碼中映射 Web 窗體的 DataGrid(MyGrid)控件的變量;一個是用來操作 DataGrid 的 Price 列中運(yùn)行時統(tǒng)計的雙精度值。
Page_Load 事件
在 Page_Load 事件中,你所要做的就是連接到 SQL Server 并執(zhí)行一個簡單的 SqlCommand。 你取得了所有 Price 值>0 的 title 和 price 數(shù)據(jù)。你使用 SqlCommand.ExecuteReader 方法返回一個 SqlDataReader 并將其直接綁定到 DataGrid (MyGrid)。
protected void Page_Load(object sender, EventArgs e) { SqlConnection myConnection = new SqlConnection("server=Localhost;database=pubs;uid=sa;pwd=;");//創(chuàng)建SQL連接 SqlCommand myCommand = new SqlCommand("SELECT title, price FROM Titles WHERE price > 0", myConnection);//創(chuàng)建SQL命令 try { myConnection.Open();//打開數(shù)據(jù)庫連接 MyGrid.DataSource = myCommand.ExecuteReader();//指定 DataGrid 的數(shù)據(jù)源 MyGrid.DataBind();//綁定數(shù)據(jù)到 DataGrid myConnection.Close();//關(guān)閉數(shù)據(jù)連接 } catch(Exception ex) { //捕獲錯誤 HttpContext.Current.Response.Write(ex.ToString()); } } |
CalcTotals 方法
CalcTotals 方法用來處理 runningTotal 變量。這個值將以字符串形式來傳遞。 你需要將它解析為雙精度型,然后 runningTotal 變量就成了雙精度類型。
private void CalcTotal(string _price) { try { runningTotal += Double.Parse(_price); } catch { //捕獲錯誤 } } |
MyGrid_ItemDataBound 事件
MyGrid_ItemDataBound 事件在數(shù)據(jù)源中每行綁定到 DataGrid 時被調(diào)用。在這個事件處理中,你可以處理每一行數(shù)據(jù)。 這里你的目的是,你將需要調(diào)用 CalcTotals 方法并從 Price 列傳遞文本,并用金額型格式化每一行的 Price 列, 并在頁腳行中顯示 runningTotal 的值。
public void MyDataGrid_ItemDataBound(object sender, DataGridItemEventArgs e) { 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)); } else if(e.Item.ItemType == ListItemType.Footer ) { e.Item.Cells[0].Text="Total"; e.Item.Cells[1].Text = string.Format("{0:c}", runningTotal); } } |
在 MyGrid_ItemDataBound 事件句柄中,首先你得使用 ListItemType 判斷當(dāng)前的 DataGridItem 是一個數(shù)據(jù)項(xiàng)還是AlternatingItem 行。如果是數(shù)據(jù)項(xiàng),你調(diào)用 CalcTotals,并將 Price 列的值作為參數(shù)傳遞給它;然后你以金額格式對 Price 列進(jìn)行格式化及著色。
如果 DataGridItem 是頁腳,可以用金額格式顯示 runningTotal。
總結(jié)
在這份指南中,你學(xué)到了怎樣使用 DataGrid.OnItemDataBound 事件來實(shí)現(xiàn)運(yùn)行時對DataGrid 的某一列進(jìn)行統(tǒng)計。使用這個事件,你可以創(chuàng)建一個列的合計并可對DataGrid行的頁腳進(jìn)行著色。
相關(guān)文章
在.NET6中使用配置Quartz.NET定時任務(wù)并使用IHostedService實(shí)現(xiàn)項(xiàng)目啟動自動加載任務(wù)
Quartz.Net是一個強(qiáng)大、開源、輕量的作業(yè)調(diào)度框架,在平時的項(xiàng)目開發(fā)當(dāng)中也會時不時的需要運(yùn)用到定時調(diào)度方面的功能,這篇文章主要介紹了在.NET6中使用配置Quartz.NET定時任務(wù)并使用IHostedService實(shí)現(xiàn)項(xiàng)目啟動自動加載任務(wù),需要的朋友可以參考下2024-04-04.NET使用CsvHelper快速讀取和寫入CSV文件的操作方法
在日常開發(fā)中使用CSV文件進(jìn)行數(shù)據(jù)導(dǎo)入和導(dǎo)出、數(shù)據(jù)交換是非常常見的需求,今天我們來講講在.NET中如何使用CsvHelper這個開源庫快速實(shí)現(xiàn)CSV文件讀取和寫入,需要的朋友可以參考下2024-06-06ajax.net +jquery 無刷新三級聯(lián)動的實(shí)例代碼
ajax.net +jquery 無刷新三級聯(lián)動的實(shí)例代碼,需要的朋友可以參考一下2013-05-05.net mvc頁面UI之Jquery博客日歷控件實(shí)現(xiàn)代碼
最近在做一個博客系統(tǒng),其他需要用到博客日歷控件,網(wǎng)上搜索了很多資料,其中大部分都是javascript的,經(jīng)過總結(jié)使用jquery實(shí)現(xiàn)了博客日歷效果。代碼如下2013-09-093分鐘快速學(xué)會在ASP.NET Core MVC中如何使用Cookie
這篇文章主要給大家介紹了關(guān)于如何通過3分鐘快速學(xué)會在ASP.NET Core MVC中使用Cookie的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用ASP.NET具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12asp.net access web.config denied
如果出現(xiàn)這個問題,最好首先檢查一下ASPNET的帳號,是否有訪問權(quán)限。2009-04-04asp.net Repeater 數(shù)據(jù)綁定代碼
asp.net Repeater 數(shù)據(jù)綁定代碼2010-03-03