閱讀111 返回首頁    go 微軟 go windows


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

  上一篇:go ASP.NET Web Page應用深入探討
  下一篇:go 使用遊戲引擎實現的水波紋