論壇中最常見的一個問題是 我怎樣在 DataGrid 中顯示列合計? 我親自多次為這個問題提供了示例代碼因此我想在DotNetJunkies 的標題中提供這麼一份指南 在這份指南中你將會學到怎樣在 DataGrid 中編程實現對某一列的值進行統計並在 DataGrid 的頁腳中顯示其合計值這份指南中供下載的示例中包括了 C# 和 Visual BasicNET 兩種代碼
這份指南的最終結果看起來像這樣
從上圖可看出
上面所用到的屏幕圖片中的 DataGrid 是一個非常典型的 DataGrid 有許多控制 DataGrid 外觀的屬性它使用兩個 BoundColumns 來操作數據但這並不是最重要的做好這項工作真正重要的是使用 DataGridOnItemDataBound 事件這個事件將會觸發每次綁定一條記錄到 DataGrid你可以為這個事件創建一個事件處理以操作數據記錄在這種情況下你將會得到運行時 Price 列的合計值
頁腳指的是數據范圍的最後一行當這行被限定時在事件句處理你可以得到 Price 列的運行時統計值
實施
首先讓我們找到一種方法來操作 Web 窗體輸出 這份指南中你將使用一個 Web 窗體 (calcTotalsaspx) 以及一個類代碼文件 (calcTotalsaspxcs)這份指南的意圖是 類代碼將會使用 JustInTime 編譯器來編譯 這裡是 calcTotalsaspx 的代碼
AutoGenerateColumns=False CellPadding= CellSpacing= BorderStyle=Solid BorderWidth= Gridlines=None BorderColor=Black ItemStyleFontName=Verdana ItemStyleFontSize=pt HeaderStyleFontName=Verdana HeaderStyleFontSize=pt HeaderStyleFontBold=True HeaderStyleForeColor=White HeaderStyleBackColor=Blue FooterStyleFontName=Verdana FooterStyleFontSize=pt FooterStyleFontBold=True FooterStyleForeColor=White FooterStyleBackColor=Blue OnItemDataBound=MyDataGrid_ItemDataBound ShowFooter=True>
ItemStyleHorizontalAlign=Right HeaderStyleHorizontalAlign=Center />
在 Web 窗體中你使用 @ Page 來直接聲明這個頁所繼承的類代碼SRC 屬性指明了類代碼將使用 JIT 編譯器來編譯 Web 窗體中的大部分代碼樣式聲明用來使 DataGrid 外觀變得更好看
最後指定的屬性之一是 OnItemDataBound 屬性這個事件將會在 OnItemDataBound 事件發生時被觸發
Web 窗體中的 DataGrid (MyGrid) 包含有兩個 BoundColumns一個是 Title 另一個是Price 這裡將顯示 Pubs 數據庫(SQL Server)中 Titles 表的 title 及 price 列
忽略代碼的定義
類代碼在所有的地方都將使用在類代碼中你可以操作兩個事件Page_Load 事件以及 MyGrid_OnItemDataBound 事件還有一個私有方法 CalcTotal 用它來簡單的完成運行時統計的數學運算
類代碼基本結構塊的起始部分
using Systemusing SystemWebusing SystemWebUIusing SystemWebUIWebControlsusing SystemWebUIHtmlControlsusing SystemDatausing SystemDataSqlClient
namespace myApp { public class calcTotals Page { protected DataGrid MyGridprivate double runningTotal = }
在類代碼的基本結構中你必須使用相關語句導入名字空間(namespace)在類聲明中你聲明了兩個變量一個是類代碼中映射 Web 窗體的 DataGrid(MyGrid)控件的變量一個是用來操作 DataGrid 的 Price 列中運行時統計的雙精度值
Page_Load 事件
在 Page_Load 事件中你所要做的就是連接到 SQL Server 並執行一個簡單的 SqlCommand 你取得了所有 Price 值> 的 title 和 price 數據你使用 SqlCommandExecuteReader 方法返回一個 SqlDataReader 並將其直接綁定到 DataGrid (MyGrid)
protected void Page_Load(object sender EventArgs e)
{ SqlConnection myConnection = new SqlConnection(server=Localhostdatabase=pubsuid=sapwd=)//創建SQL連接SqlCommand myCommand = new SqlCommand(SELECT title price FROM Titles WHERE price > myConnection)//創建SQL命令
try { myConnectionOpen()//打開數據庫連接MyGridDataSource = myCommandExecuteReader()//指定 DataGrid 的數據源MyGridDataBind()//綁定數據到 DataGrid myConnectionClose()//關閉數據連接} catch(Exception ex)
{ //捕獲錯誤HttpContextCurrentResponseWrite(exToString())}
CalcTotals 方法
CalcTotals 方法用來處理 runningTotal 變量這個值將以字符串形式來傳遞 你需要將它解析為雙精度型然後 runningTotal 變量就成了雙精度類型
private void CalcTotal(string _price)
{ try { runningTotal += DoubleParse(_price)} catch { //捕獲錯誤}
MyGrid_ItemDataBound 事件
MyGrid_ItemDataBound 事件在數據源中每行綁定到 DataGrid 時被調用在這個事件處理中你可以處理每一行數據 這裡你的目的是你將需要調用 CalcTotals 方法並從 Price 列傳遞文本並用金額型格式化每一行的 Price 列 並在頁腳行中顯示 runningTotal 的值
public void MyDataGrid_ItemDataBound(object sender DataGridItemEventArgs e)
{ if (eItemItemType == ListItemTypeItem eItemItemType == ListItemTypeAlternatingItem)
{ CalcTotal( eItemCells[]Text )eItemCells[]Text = stringFormat({c} ConvertToDouble(eItemCells[]Text))} else if(eItemItemType == ListItemTypeFooter )
{ eItemCells[]Text=TotaleItemCells[]Text = stringFormat({c} runningTotal)}
在 MyGrid_ItemDataBound 事件句柄中首先你得使用 ListItemType 判斷當前的 DataGridItem 是一個數據項還是AlternatingItem 行如果是數據項你調用 CalcTotals並將 Price 列的值作為參數傳遞給它然後你以金額格式對 Price 列進行格式化及著色
如果 DataGridItem 是頁腳可以用金額格式顯示 runningTotal
總結
在這份指南中你學到了怎樣使用 DataGridOnItemDataBound 事件來實現運行時對DataGrid 的某一列進行統計使用這個事件你可以創建一個列的合計並可對DataGrid行的頁腳進行著色
From:http://tw.wingwit.com/Article/program/net/201311/13921.html