這份指南的最終結(jié)果看起來像這樣:
![]() |
上面所用到的屏幕圖片中的 DataGrid 是一個(gè)非常典型的 DataGrid 。有許多控制 DataGrid 外觀的屬性,它使用兩個(gè) BoundColumns 來操作數(shù)據(jù),但這并不是最重要的。做好這項(xiàng)工作真正重要的是使用 DataGrid.OnItemDataBound 事件。這個(gè)事件將會(huì)觸發(fā)每次綁定一條記錄到 DataGrid。你可以為這個(gè)事件創(chuàng)建一個(gè)事件處理,以操作數(shù)據(jù)記錄。在這種情況下,你將會(huì)得到運(yùn)行時(shí) Price 列的合計(jì)值。
頁(yè)腳指的是數(shù)據(jù)范圍的最后一行。當(dāng)這行被限定時(shí),在事件句處理你可以得到 Price 列的運(yùn)行時(shí)統(tǒng)計(jì)值。
實(shí)施:
首先讓我們找到一種方法來操作 Web 窗體輸出。 這份指南中,你將使用一個(gè) Web 窗體 (calcTotals.aspx) 以及一個(gè)類代碼文件 (calcTotals.aspx.cs)。這份指南的意圖是, 類代碼將會(huì)使用 Just-In-Time 編譯器來編譯。 這里是 calcTotals.aspx 的代碼:
<%@ Page Inherits="myApp.calcTotals" Src="20010731T0101.aspx.cs" %>
|
最后指定的屬性之一是 OnItemDataBound 屬性。這個(gè)事件將會(huì)在 OnItemDataBound 事件發(fā)生時(shí)被觸發(fā)。
Web 窗體中的 DataGrid (MyGrid) 包含有兩個(gè) BoundColumns,一個(gè)是 Title ,另一個(gè)是Price。 這里將顯示 Pubs 數(shù)據(jù)庫(kù)(SQL Server)中 Titles 表的 title 及 price 列。
忽略代碼的定義
類代碼在所有的地方都將使用。在類代碼中,你可以操作兩個(gè)事件:Page_Load 事件以及 MyGrid_OnItemDataBound 事件。還有一個(gè)私有方法 CalcTotal, 用它來簡(jiǎn)單的完成運(yùn)行時(shí)統(tǒng)計(jì)的數(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 |
Page_Load 事件
在 Page_Load 事件中,你所要做的就是連接到 SQL Server 并執(zhí)行一個(gè)簡(jiǎn)單的 SqlCommand。 你取得了所有 Price 值>0 的 title 和 price 數(shù)據(jù)。你使用 SqlCommand.ExecuteReader 方法返回一個(gè) 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 |
CalcTotals 方法用來處理 runningTotal 變量。這個(gè)值將以字符串形式來傳遞。 你需要將它解析為雙精度型,然后 runningTotal 變量就成了雙精度類型。
private void CalcTotal(string _price) { try { runningTotal += Double.Parse(_price); } catch { //捕獲錯(cuò)誤 } } |
MyGrid_ItemDataBound 事件在數(shù)據(jù)源中每行綁定到 DataGrid 時(shí)被調(diào)用。在這個(gè)事件處理中,你可以處理每一行數(shù)據(jù)。 這里你的目的是,你將需要調(diào)用 CalcTotals 方法并從 Price 列傳遞文本,并用金額型格式化每一行的 Price 列, 并在頁(yè)腳行中顯示 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); } } |
如果 DataGridItem 是頁(yè)腳,可以用金額格式顯示 runningTotal。
總結(jié)
在這份指南中,你學(xué)到了怎樣使用 DataGrid.OnItemDataBound 事件來實(shí)現(xiàn)運(yùn)行時(shí)對(duì)DataGrid 的某一列進(jìn)行統(tǒng)計(jì)。使用這個(gè)事件,你可以創(chuàng)建一個(gè)列的合計(jì)并可對(duì)DataGrid行的頁(yè)腳進(jìn)行著色。
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com