1. 程式人生 > >在DataGrid中新增一個合計欄位

在DataGrid中新增一個合計欄位

上面所用到的螢幕圖片中的 DataGrid 是一個非常典型的 DataGrid 。有許多控制 DataGrid 外觀的屬性,它使用兩個 BoundColumns 來操作資料,但這並不是最重要的。做好這項工作真正重要的是使用 DataGrid.OnItemDataBound 事件。這個事件將會觸發每次繫結一條記錄到 DataGrid。你可以為這個事件建立一個事件處理,以操作資料記錄。在這種情況下,你將會得到執行時 Price 列的合計值。

頁尾指的是資料範圍的最後一行。當這行被限定時,在事件句處理你可以得到 Price 列的執行時統計值。

實施:

首先讓我們找到一種方法來操作 Web 窗體輸出。 這份指南中,你將使用一個 Web 窗體 (calcTotals.aspx

) 以及一個類程式碼檔案 (calcTotals.aspx.cs)。這份指南的意圖是, 類程式碼將會使用 Just-In-Time 編譯器來編譯。 這裡是 calcTotals.aspx 的程式碼:

<%@ Page Inherits="myApp.calcTotals" Src="20010731T0101.aspx.cs" %>
<html>
<body bgcolor="
white">
<asp:DataGrid id="MyGrid" runat="server"
  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">
  <Columns>
    <asp:BoundColumn HeaderText="
Title" DataField="title" />
    <asp:BoundColumn HeaderText="
Price" DataField="price"
      ItemStyle-HorizontalAlign="
Right"
      HeaderStyle-HorizontalAlign="Center" />
   </Columns>
</asp:DataGrid>
</body>
</html>

在 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 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;
  }
}

在類程式碼的基本結構中,你必須使用相關語句匯入名字空間(namespace)。在類宣告中,你聲明瞭兩個變數,一個是類程式碼中對映 Web 窗體的 DataGrid(MyGrid)控制元件的變數;一個是用來操作 DataGrid 的 Price 列中執行時統計的雙精度值。 

Page_Load 事件

Page_Load 事件中,你所要做的就是連線到 SQL Server 並執行一個簡單的 SqlCommand。 你取得了所有 Price 值>0 的 title 和 price 資料。你使用 SqlCommand.ExecuteReader 方法返回一個 SqlDataReader 並將其直接繫結到 DataGrid (MyGrid)。

protected void Page_Load(object sender, EventArgs e)
{
  SqlConnection myConnection = new SqlConnection("server=Localhost;database=pubs;uid=sa;pwd=;");//建立SQL連線
  SqlCommand myCommand = new SqlCommand("SELECT title, price FROM Titles WHERE price > 0", myConnection);//建立SQL命令

  try
  {
    myConnection.Open();//開啟資料庫連線
    MyGrid.DataSource = myCommand.ExecuteReader();//指定 DataGrid 的資料來源
    MyGrid.DataBind();//繫結資料到 DataGrid
    myConnection.Close();//關閉資料連線
  }
  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 事件在資料來源中每行繫結到 DataGrid 時被呼叫。在這個事件處理中,你可以處理每一行資料。 這裡你的目的是,你將需要呼叫 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判斷當前的 DataGridItem 是一個數據項還是AlternatingItem 行。如果是資料項,你呼叫 CalcTotals,並將 Price 列的值作為引數傳遞給它;然後你以金額格式對 Price 列進行格式化及著色。

如果 DataGridItem 是頁尾,可以用金額格式顯示 runningTotal

總結

在這份指南中,你學到了怎樣使用 DataGrid.OnItemDataBound 事件來實現執行時對DataGrid 的某一列進行統計。使用這個事件,你可以建立一個列的合計並可對DataGrid行的頁尾進行著色。

相關推薦

DataGrid新增一個合計

上面所用到的螢幕圖片中的 DataGrid 是一個非常典型的 DataGrid 。有許多控制 DataGrid 外觀的屬性,它使用兩個 BoundColumns 來操作資料,但這並不是最重要的。做好這項工作真正重要的是使用 DataGrid.OnItemDataBound 事

spring data jpa 框架在實體類新增非資料庫的屬性

    Spring-data-jpa表實體的欄位和表的欄位是一一對應的。比如,那麼,如果我在查詢時,想在表字段的基礎上新增幾個返回的欄位,怎麼辦? 解:在實體類中新增我們想新增的欄位,並加上註解:@

Mysql一個varchar被包含如(=河北條件是河北省)

re為位置的欄位此處想匹配的是河北 方法一: SELECT * FROM users WHERE find_in_set('河北省', re); 意思就是:mysql有很多字串函式 find_in_set(str1,str2)函式是返回str2中str1所在的位置索引,str2必須以",

SQL 一個使用者表一個積分,假如資料庫有100多萬個使用者,若要在每年第一天凌晨將積分清零,你將考慮什麼,你將想什麼辦法解決?

                    alter table drop column score;                   alter table add colunm score int;                   可能會很快,但是需要試驗,試驗

C#如何向資料庫一個Int新增空值?

 例如員工表:         欄位名   資料型別         姓名           nvarchar     性別           int         其中“性別”是允許為空的,當新員工在註冊自己資訊時沒有在textBox這些控制元件中填這項的時候,如何往

Spring Security在標準登入表單新增一個額外的

概述 在本文中,我們將通過向標準登入表單新增額外欄位來實現Spring Security的自定義身份驗證方案。 我們將重點關注兩種不同的方法,以展示框架的多功能性以及我們可以使用它的靈活方式。 我們的第一種方法是一個簡單的解決方案,專注於重用現有的核心Spring Security實現。 我們的第二種方法是更

如何在實體類entity新增沒有對應的

@Transient表示該屬性並非一個到資料庫表的欄位的對映,ORM框架將忽略該屬性.  如果一個屬性並非資料庫表的欄位對映,務必將其標示為@Transient,否則,ORM框架預設其註解為@Basic 比如現在有實體類Message,但是我想在使用它時想要多用一個欄位來接收未讀訊

SQL查詢有很多,就不想要其中一個的方法

在sql查詢中 通常選取欄位都是select 欄位1,欄位2,欄位3....... from 表, 如果有很多欄位,就不想要其中一個 有沒有方法能 select 非(欄位1) from 表 查到其他欄位的內容呢 把欄位1去掉declare @s nvarchar(10

SQL從DB取出多個賦值給多個變數/一個給單個變數賦值

  DECLARE @FIRST_BEGIN    DATETIME DECLARE @FIRST_END        DATETIME DECLARE @SECOND_BEGIN    DATETIME DECLARE @SECOND_END        DATETI

在thinkcmf5實現為各個分類下的文章新增自定義的想法

前言 這裡只是自己的一個想法。此想法只完成了裡面的一部分。記於此,希望有同樣需求的同學們共同討論和學習。 我也是剛學習使用這個框架。在學習使用的過程中有這樣的一個需求。我的某一個文章分類下面的文章需要新增兩個欄位(原價、現價),我想很多同學都有這樣的需求吧。

sqlserver給表與新增描述

表及欄位描述資訊處理示例: --建立表 create table 表(a1 varchar(10),a2 char(2)) --為表新增描述資訊 EXECUTE sp_addextendedpro

MongoDB 批量新增記錄不存在的

MongoDB是基於分散式檔案儲存的資料庫,與關係型資料庫不同,記錄中的欄位數量可以各不相同。本文將介紹如何對MongoDB記錄中不存在的欄位進行批量新增並賦值。 MongoDB update方法

mysql資料庫id中間記錄刪除以後,再新增記錄id順序被打亂

舉個例子 id 1 2 3 4 5 6 7 8 這是8條記錄 id 欄位設定是自動遞增的現在刪除其中的7 8 共2條記錄再新增一條記錄雖然記錄刪除了,但是id還是從未刪除的時候繼續增長,現在把表中id自動增長關閉,把id=9的記錄刪除 再新增記錄現在就可以了

Oracle資料庫新增時間戳的觸發器

在最近通過webservices介面同步增量資料時。發現在同步之前發現沒有獲取到增加的資料集。檢查程式碼發現發現做了update操作時,時間戳欄位沒有更新。或者insert操作時,沒有預設給時間戳欄位一個系統當前的值。所以在資料庫層面做了一個觸發器。如下SQL語句 CREATE OR REP

在scrapy框架Header使用Content-Length使爬蟲返回400錯誤的問題

之前在抓一個網站Danaos的時候,發現能用requests和postman傳送同樣的header和payload的時候都能得到正確的結果,但是scrapy就會返回400錯誤,後來發現這是Twisted本身存在的問題,看了官網也沒找到解決方法 spider檔案在這裡: class Da

postgresql資料庫geometry型別的插入經緯度指令碼

在postgresql資料庫中,如果欄位型別是geometry,我們要更新該欄位為經緯度(座標),可以嘗試採取以下指令碼: update device set shape = ST_GeomFromText(‘POINT(108.658463 34.1437)’, 4610) where n

Java List新增一個物件多次

在實際應用場景中,可以需要在一個List中新增多個物件,在使用的時候有個誤區就是將一個物件新增多次到List中,導致資料不一致。 測試程式碼: public class test { public static void main(String[] args) {

ORA——00600錯誤的原因是:(Oracle對clob型別的操作)

ORA——00600錯誤的原因是:(Oracle中對clob型別欄位的操作) 改正的程式碼如下: //3.2生成資料插入語句 (增加的方式) StringBuilder insertSql = new StringBuilder(“INSERT INTO “); insertSql.a

使用gevent.monkey.patch_all() 協程池遇到阻塞,在任務新增一個sleep()搞定~

關於使用gevent.monkey.patch_all()協程池遇到阻塞解決辦法: import time ... class Example: ... time.sleep(0.000001) 在進行多執行緒時monkey會阻塞住執行緒的繼續執行,需要對monkey.p

webgl新增一個div框實現框選

在webgl的開發中,新增一個div,可以實現框選的樣式。過程很簡單,直接看程式碼吧,這裡主要實現了點選第一次的時候確定div的位置,第二次實時顯示div的大小及樣式。這裡為了顯示實在canvas上畫div,將canvas設定為紅色。 <!DOCTYPE HTML PUBLIC "-//