这份指南的最终结果看起来像这样:
从上图可看出:
上面所用到的屏幕图片中的DataGrid是一个非常典型的DataGrid。有许多控制DataGrid外观的属性,它使用两个BoundColumns来操作数据,但这并不是最重要的。做好这项工作真正重要的是使用DataGrid.OnItemDataBound事件。这个事件将会触发每次绑定一条记录到DataGrid。你可以为这个事件创建一个事件处理,以操作数据记录。在这种情况下,你将会得到运行时Price列的合计值。
页脚指的是数据范围的最后一行。当这行被限定时,在事件句处理你可以得到Price列的运行时统计值。
实施:
首先让我们找到一种方法来操作Web窗体输出。这份指南中,你将使用一个Web窗体(calcTotals.aspx)以及一个类代码文件(calcTotals.aspx.cs)。这份指南的意图是,类代码将会使用Just-In-Time编译器来编译。这里是calcTotals.aspx的代码:
|
在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 |
在类代码的基本结构中,你必须使用相关语句导入名字空间(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 |
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行的页脚进行着色。