ASP.NET の DataGrid に合計フィールドを追加します
著者:Eve Cole
更新時間:2009-06-30 15:40:15
フォーラムで最もよく寄せられる質問の 1 つは、「DataGrid で列の合計を表示するにはどうすればよいですか?」です。 私は個人的にこの質問に対して何度もサンプル コードを提供してきたので、DotNetJunkies というタイトルでそのようなガイドを提供したいと思いました。 このガイドでは、DataGrid 内の列の値をプログラムでカウントし、DataGrid のフッターに合計値を表示する方法を学習します。このガイドのダウンロード可能なサンプルには、C# コードと Visual Basic.NET コードの両方が含まれています。
このガイドの最終結果は次のようになります。
上の写真からわかるように:
上で使用した画面図の DataGrid は、非常に典型的な DataGrid です。 DataGrid の外観を制御するプロパティは多数あります。DataGrid は 2 つの BoundColumn を使用してデータを操作しますが、それは最も重要なわけではありません。これをうまく行うために本当に重要なことは、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" %>
|
AutoGenerateColumns="False" CellPadding="4" CellSpacing="0" BorderStyle="Solid" BorderWidth="1" グリッド線 = "なし" 境界線の色 = "黒" ItemStyle-Font-Name="ベルダナ" itemStyle-Font-Size="9pt" HeaderStyle-Font-Name="ベルダナ" HeaderStyle-Font-Size="10pt" HeaderStyle-Font-Bold="True" HeaderStyle-ForeColor="白" HeaderStyle-BackColor="青" FooterStyle-Font-Name="ベルダナ" FooterStyle-Font-Size="10pt" FooterStyle-Font-Bold="True" FooterStyle-ForeColor="白" FooterStyle-BackColor="青" OnItemDataBound="MyDataGrid_ItemDataBound" ShowFooter="True">
|
ItemStyle-horizontalAlign="右" HeaderStyle-horizontalAlign="Center" />
|
Web フォームでは、@Page を使用して、ページが継承するクラス コードを直接宣言します。 SRC 属性は、クラス コードが JIT コンパイラを使用してコンパイルされることを示します。 Web フォームのコード スタイル宣言のほとんどは、DataGrid の見栄えを良くするために使用されます。
最後に指定されたプロパティの 1 つは OnItemDataBound プロパティです。このイベントは、OnItemDataBound イベントが発生するとトリガーされます。
Web フォームの DataGrid (MyGrid) には 2 つの BoundColumns が含まれており、1 つはタイトル、もう 1 つは価格です。 Pubs データベース (SQL Server) の Titles テーブルのタイトルと価格の列がここに表示されます。
コード定義を無視する
クラスコードはどこでも使用されます。クラスコードでは、Page_Load イベントと MyGrid_OnItemDataBound イベントの 2 つのイベントを操作できます。プライベート メソッド CalcTotal もあります。これを使用すると、ランタイム統計に対して単純に数学的演算を実行できます。
クラスコードの基本構造ブロックの始まり:
システムを使用する; System.Web を使用します。 System.Web.UI を使用します。 System.Web.UI.WebControls を使用します。 System.Web.UI.HtmlControls を使用します。 System.Data を使用します。 System.Data.SqlClient を使用します。
名前空間 myApp { パブリック クラス calcTotals : ページ { 保護された DataGrid MyGrid。 プライベートダブルランニング合計 = 0; } } |
クラス コードの基本構造では、関連するステートメントを使用して名前空間 (名前空間) をインポートする必要があります。クラス宣言では、2 つの変数を宣言します。1 つはクラス コードで Web フォームの DataGrid (MyGrid) コントロールをマッピングする変数で、もう 1 つは DataGrid の Price 列の実行時統計を操作するために使用される倍精度値です。 。
Page_Load イベント
Page_Load イベントでは、SQL Server に接続して単純な SqlCommand を実行するだけです。 価格値 > 0 のすべてのタイトルと価格データを取得しました。 SqlCommand.ExecuteReader メソッドを使用して SqlDataReader を返し、それを DataGrid (MyGrid) に直接バインドします。
protected void Page_Load(オブジェクト送信者, 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コマンドを作成
試す { myConnection.Open();//データベース接続を開きます MyGrid.DataSource = myCommand.ExecuteReader();//DataGrid のデータ ソースを指定します MyGrid.DataBind();//データを DataGrid にバインドします myConnection.Close();//データ接続を閉じる} catch(例外例) { //エラーをキャッチする HttpContext.Current.Response.Write(ex.ToString()); } } |
CalcTotals メソッド
CalcTotals メソッドは、runningTotal 変数を処理するために使用されます。この値は文字列として渡されます。 これを double として解析する必要があると、runningTotal 変数が double になります。
private void CalcTotal(string _price) { 試す { runningTotal += Double.Parse(_price); } キャッチ { //エラーをキャッチ} } |
MyGrid_ItemDataBound イベント
MyGrid_ItemDataBound イベントは、データ ソースの各行が DataGrid にバインドされるときに呼び出されます。このイベント ハンドラーでは、データの各行を処理できます。 ここでの目的のために、CalcTotals メソッドを呼び出し、Price 列からテキストを渡し、各行の Price 列を金額でフォーマットし、フッター行に runningTotal 値を表示する必要があります。
public void MyDataGrid_ItemDataBound(オブジェクト送信者、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="合計"; e.Item.Cells[1].Text = string.Format("{0:c}", runningTotal); } } |
MyGrid_ItemDataBound イベント ハンドラーでは、まず ListItemType を使用して、現在の DataGridItem がデータ項目であるか AlternatingItem 行であるかを判断する必要があります。データ項目の場合は、CalcTotals を呼び出し、Price 列の値をパラメータとして渡し、Price 列を金額形式で書式設定して色付けします。
DataGridItem がフッターの場合、runningTotal を金額形式で表示できます。
要約する
このガイドでは、DataGrid.OnItemDataBound イベントを使用して DataGrid 列の実行時統計を実行する方法を学習しました。このイベントを使用すると、列の合計を作成し、DataGrid 行のフッターに色を付けることができます。