Share via


GridView のフッターに概要情報を表示する (VB)

作成者: Scott Mitchell

PDF のダウンロード

概要情報は、多くの場合、レポートの下部にあるサマリー行に表示されます。 GridView コントロールには、プログラムによって集計データを挿入できるセルを含むフッター行を含めることができます。 このチュートリアルでは、このフッター行に集計データを表示する方法について説明します。

はじめに

各製品の価格、在庫単位、注文単位、並べ替えレベルに加えて、ユーザーは、平均価格、在庫の合計ユニット数などの集計情報にも関心がある場合があります。 このような概要情報は、多くの場合、レポートの下部にあるサマリー行に表示されます。 GridView コントロールには、プログラムによって集計データを挿入できるセルを含むフッター行を含めることができます。

このタスクは、次の 3 つの課題を示します。

  1. フッター行を表示するように GridView を構成する
  2. 概要データの決定。つまり、平均価格または在庫単位の合計を計算するにはどうすればよいですか?
  3. フッター行の適切なセルにサマリー データを挿入する

このチュートリアルでは、これらの課題を克服する方法について説明します。 具体的には、選択したカテゴリの製品が GridView に表示されているドロップダウン リストにカテゴリを一覧表示するページを作成します。 GridView にはフッター行が含まれます。この行には、在庫の平均価格と合計ユニット数、およびそのカテゴリの製品の注文を示す行が含まれます。

概要情報が GridView のフッター行に表示される

図 1: 概要情報が GridView のフッター行に表示される (フルサイズの画像を表示する をクリックします)

このチュートリアルでは、製品マスター/詳細インターフェイスへのカテゴリを使用して、前の 「Master/Detail Filtering With a DropDownList 」チュートリアルで説明した概念に基づいています。 前のチュートリアルをまだ行っていない場合は、このチュートリアルを続行する前に行ってください。

手順 1: カテゴリ DropDownList と Products GridView の追加

GridView のフッターに概要情報を追加する前に、まずマスター/詳細レポートを作成しましょう。 この最初の手順を完了したら、概要データを含める方法について説明します。

まず、 フォルダー内の SummaryDataInFooter.aspx ページを CustomFormatting 開きます。 DropDownList コントロールを追加し、その を ID に設定します Categories。 次に、DropDownList のスマート タグから [データ ソースの選択] リンクをクリックし、クラスのメソッドを呼び出す という名前CategoriesDataSourceGetCategories()新しい ObjectDataSource をCategoriesBLL追加することを選択します。

CategoriesDataSource という名前の新しい ObjectDataSource を追加する

図 2: 名前付きの CategoriesDataSource 新しい ObjectDataSource を追加する (フルサイズの画像を表示する場合はクリックします)

ObjectDataSource で CategoriesBLL クラスの GetCategories() メソッドを呼び出す

図 3: ObjectDataSource でクラスのメソッドをCategoriesBLL呼び出す (フルサイズのGetCategories()画像を表示する場合はクリックします)

ObjectDataSource を構成すると、DropDownList のデータ ソース構成ウィザードに戻ります。そこから、表示するデータ フィールドの値と、DropDownList ListItem の値に対応するデータ フィールドの値を指定する必要があります。 フィールドを CategoryName 表示し、 を CategoryID 値として使用します。

ListItems のテキストと値として CategoryName フィールドと CategoryID フィールドをそれぞれ使用する

図 4: フィールドと CategoryID フィールドをそれぞれ CategoryName と としてListItemTextValue使用します (フルサイズの画像を表示するには、ここをクリックします)

この時点で、システム内のカテゴリを一覧表示する DropDownList (Categories) があります。 ここで、選択したカテゴリに属する製品を一覧表示する GridView を追加する必要があります。 ただし、その前に、DropDownList のスマート タグの [自動ポストバックを有効にする] チェック ボックスをチェックしてください。 「Master/Detail Filtering With a DropDownList」チュートリアルで説明したように、DropDownList のAutoPostBackプロパティをページにTrue設定すると、DropDownList の値が変更されるたびにポストバックされます。 これにより、GridView が更新され、新しく選択されたカテゴリの製品が表示されます。 プロパティが AutoPostBack (既定値) に False 設定されている場合、カテゴリを変更してもポストバックは発生しないため、一覧表示されている製品は更新されません。

DropDownList のスマート タグで [自動ポストバックを有効にする] チェック ボックスをオンにします

図 5: DropDownList のスマート タグの [自動ポストバックを有効にする] チェック ボックスをオンにする (フルサイズの画像を表示するをクリックします)

選択したカテゴリの製品を表示するために、GridView コントロールをページに追加します。 GridView の を にProductsInCategory設定し、 という名前ProductsInCategoryDataSourceID新しい ObjectDataSource にバインドします。

ProductsInCategoryDataSource という名前の新しい ObjectDataSource を追加する

図 6: 名前付きの ProductsInCategoryDataSource 新しい ObjectDataSource を追加する (フルサイズの画像を表示する場合はクリックします)

クラスGetProductsByCategoryID(categoryID)の メソッドを呼び出すように ObjectDataSource をProductsBLL構成します。

ObjectDataSource で GetProductsByCategoryID(categoryID) メソッドを呼び出す

図 7: ObjectDataSource でメソッドを呼び出す GetProductsByCategoryID(categoryID) (クリックするとフルサイズの画像が表示されます)

メソッドは GetProductsByCategoryID(categoryID) 入力パラメーターを受け取るので、ウィザードの最後の手順でパラメーター値のソースを指定できます。 選択したカテゴリの製品を表示するには、 パラメーターを DropDownList から Categories プルします。

categoryID パラメーター値が選択された [データ ソースの構成] ウィンドウを示すスクリーンショット。

図 8: 選択したカテゴリ DropDownList からパラメーター値を取得 categoryID する (フルサイズの画像を表示する をクリックします)

ウィザードを完了すると、GridView には各製品プロパティの BoundField が含まれます。 これらの BoundFields をクリーンして、および UnitsOnOrder BoundFields のみがUnitsInStockProductNameUnitPrice表示されるようにしましょう。 フィールド レベルの設定を残りの BoundFields に自由に追加できます (通貨として を UnitPrice 書式設定するなど)。 これらの変更を行った後、GridView の宣言型マークアップは次のようになります。

<asp:GridView ID="ProductsInCategory" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="ProductsInCategoryDataSource"
    EnableViewState="False">
    <Columns>
        <asp:BoundField DataField="ProductName" HeaderText="Product"
          SortExpression="ProductName" />
        <asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}"
          HeaderText="Price"
            HtmlEncode="False" SortExpression="UnitPrice">
            <ItemStyle HorizontalAlign="Right" />
        </asp:BoundField>
        <asp:BoundField DataField="UnitsInStock"
          HeaderText="Units In Stock" SortExpression="UnitsInStock">
            <ItemStyle HorizontalAlign="Right" />
        </asp:BoundField>
        <asp:BoundField DataField="UnitsOnOrder"
          HeaderText="Units On Order" SortExpression="UnitsOnOrder">
            <ItemStyle HorizontalAlign="Right" />
        </asp:BoundField>
    </Columns>
</asp:GridView>

この時点で、選択したカテゴリに属する製品の名前、単価、在庫単位、および注文単位を示す完全に機能するマスター/詳細レポートがあります。

飲料カテゴリに属する製品の GridView レポートを示すスクリーンショット。

図 9: 選択したカテゴリの DropDownList からパラメーター値を取得 categoryID する (フルサイズの画像を表示する をクリックします)

GridView コントロールは、ヘッダー行とフッター行の両方を表示できます。 これらの行は、 プロパティと プロパティのShowHeader値に応じてそれぞれ表示され、ShowHeader既定値Trueは と ShowFooter に設定Falseされます。ShowFooter GridView にフッターを含めるには、そのプロパティを ShowFooterTrue設定するだけです。

GridView の ShowFooter プロパティを True に設定します

図 10: GridView の プロパティを にTrue設定します (フルサイズのShowFooter画像を表示する場合はクリックします)

フッター行には、GridView で定義されている各フィールドのセルがあります。ただし、これらのセルは既定では空です。 ブラウザーで進行状況を確認してください。 プロパティを ShowFooterTrue設定すると、GridView には空のフッター行が含まれます。

GridView にフッター行が含まれるようになりました

図 11: GridView にフッター行が含まれるようになりました (フルサイズの画像を表示する場合をクリックします)

図 11 のフッター行は、背景が白であるため目立ちません。 では、濃い赤色の背景をFooterStyle指定する CSS クラスStyles.cssを作成し、Theme のスキン ファイルをDataWebControls構成GridView.skinして、この CSS クラスを GridView の FooterStyleCssClass プロパティに割り当ててみましょう。 スキンとテーマをブラッシュアップする必要がある場合は、 ObjectDataSource を使用したデータの表示に関するチュートリアルを参照してください。

まず、次の CSS クラスを に追加します Styles.css

.FooterStyle
{
    background-color: #a33;
    color: White;
    text-align: right;
}

CSS クラスの FooterStyle スタイルは クラスに HeaderStyle 似ていますが HeaderStyle、 の背景色は微妙に濃く、テキストは太字で表示されます。 さらに、フッター内のテキストは右揃えですが、ヘッダーのテキストは中央に配置されます。

次に、この CSS クラスを GridView のすべてのフッターに関連付けるには、Theme でファイルをGridView.skinDataWebControls開き、 の CssClass プロパティをFooterStyle設定します。 この追加後、ファイルのマークアップは次のようになります。

<asp:GridView runat="server" CssClass="DataWebControlStyle">
   <AlternatingRowStyle CssClass="AlternatingRowStyle" />
   <RowStyle CssClass="RowStyle" />
   <HeaderStyle CssClass="HeaderStyle" />
   <FooterStyle CssClass="FooterStyle" />
   <SelectedRowStyle CssClass="SelectedRowStyle" />
</asp:GridView>

次のスクリーン ショットに示すように、この変更によりフッターがより明確に目立ちます。

新しい背景色で書式設定された GridView のフッター行の概要データを示すスクリーンショット。

図 12: GridView のフッター行に赤みがかった背景色が表示されるようになりました (フルサイズの画像を表示する をクリックします)

手順 3: 概要データの計算

GridView のフッターを表示すると、次に直面する課題は、概要データを計算する方法です。 この集計情報を計算するには、次の 2 つの方法があります。

  1. SQL クエリを使用して、データベースに追加のクエリを発行して、特定のカテゴリの概要データを計算できます。 SQL には、データを集計するデータを指定する句と GROUP BY 共に、多数の集計関数が含まれています。 次の SQL クエリでは、必要な情報が返されます。

    SELECT CategoryID, AVG(UnitPrice), SUM(UnitsInStock),
    SUM(UnitsOnOrder)
    FROM Products
    WHERE CategoryID = categoryID
    GROUP BY CategoryID
    

    もちろん、このクエリをページからSummaryDataInFooter.aspx直接発行するのではなく、 と ProductsBLLProductsTableAdapterメソッドを作成します。

  2. 「データに 基づくカスタム書式設定 」チュートリアルで説明されているように、GridView に追加されているこの情報を計算します。GridView の RowDataBound イベント ハンドラーは、データのバインド後に GridView に追加される各行に対して 1 回起動されます。 このイベントのイベント ハンドラーを作成することで、集計する値の実行合計を保持できます。 最後のデータ行が GridView にバインドされると、合計と平均の計算に必要な情報が得られます。

私は通常、2番目のアプローチを採用しています。これは、データベースへの移動と、データ アクセス層とビジネス ロジック層に概要機能を実装するために必要な労力を節約しますが、どちらの方法でも十分です。 このチュートリアルでは、2 番目のオプションを使用し、イベント ハンドラーを使用して、実行中の合計を RowDataBound 追跡しましょう。

RowDataBound Designerで GridView を選択し、プロパティ ウィンドウから稲妻アイコンをクリックし、イベントをダブルクリックして、GridView のイベント ハンドラーをRowDataBound作成します。 または、ASP.NET 分離コード クラス ファイルの上部にあるドロップダウン リストから GridView とその RowDataBound イベントを選択することもできます。 これにより、ページの分離コード クラスに SummaryDataInFooter.aspx という名前ProductsInCategory_RowDataBoundの新しいイベント ハンドラーが作成されます。

Protected Sub ProductsInCategory_RowDataBound _
    (sender As Object, e As GridViewRowEventArgs) _
        Handles ProductsInCategory.RowDataBound
End Sub

実行中の合計を維持するには、イベント ハンドラーのスコープ外で変数を定義する必要があります。 次の 4 つのページ レベルの変数を作成します。

  • _totalUnitPrice型の 。 Decimal
  • _totalNonNullUnitPriceCount型の 。 Integer
  • _totalUnitsInStock型の 。 Integer
  • _totalUnitsOnOrder型の 。 Integer

次に、イベント ハンドラーで検出されたデータ行ごとに、これら 3 つの変数をインクリメントするコードを RowDataBound 記述します。

Dim _totalUnitPrice As Decimal = 0
Dim _totalNonNullUnitPriceCount As Integer = 0
Dim _totalUnitsInStock As Integer = 0
Dim _totalUnitsOnOrder As Integer = 0
Protected Sub ProductsInCategory_RowDataBound _
    (sender As Object, e As GridViewRowEventArgs) _
        Handles ProductsInCategory.RowDataBound
    If e.Row.RowType = DataControlRowType.DataRow Then
        Dim product As Northwind.ProductsRow = _
            CType(CType(e.Row.DataItem, DataRowView).Row, Northwind.ProductsRow)
        If Not product.IsUnitPriceNull() Then
            _totalUnitPrice += product.UnitPrice
            _totalNonNullUnitPriceCount += 1
        End If
        If Not product.IsUnitsInStockNull() Then
            _totalUnitsInStock += product.UnitsInStock
        End If
        If Not product.IsUnitsOnOrderNull() Then
            _totalUnitsOnOrder += product.UnitsOnOrder
        End If
    ElseIf e.Row.RowType = DataControlRowType.Footer Then
        Dim avgUnitPrice As Decimal = _
            _totalUnitPrice / CType(_totalNonNullUnitPriceCount, Decimal)
        e.Row.Cells(1).Text = "Avg.: " & avgUnitPrice.ToString("c")
        e.Row.Cells(2).Text = "Total: " & _totalUnitsInStock.ToString()
        e.Row.Cells(3).Text = "Total: " & _totalUnitsOnOrder.ToString()
    End If
End Sub

イベント ハンドラーは RowDataBound 、まず、DataRow を処理していることを確認します。 それが確立されると、 内の Northwind.ProductsRow オブジェクトe.RowGridViewRowバインドされたインスタンスが変数 productに格納されます。 次に、実行中の合計変数は、現在の製品の対応する値 (データベース NULL 値が含まれていない場合) でインクリメントされます。 平均価格はこれら 2 つの数値の商であるため、実行中 UnitPrice の合計と非NULLUnitPrice レコードの数の両方を追跡します。

集計されたサマリー データを使用して、最後の手順は GridView のフッター行に表示することです。 このタスクも、イベント ハンドラーを使用して RowDataBound プログラムで実行できます。 イベント ハンドラーは RowDataBound 、フッター行を含め、GridView にバインド されているすべての 行に対して発生することを思い出してください。 そのため、次のコードを使用して、イベント ハンドラーを拡張してフッター行にデータを表示できます。

Protected Sub ProductsInCategory_RowDataBound _
    (sender As Object, e As GridViewRowEventArgs) _
        Handles ProductsInCategory.RowDataBound
    If e.Row.RowType = DataControlRowType.DataRow Then
      ... Increment the running totals ...
    ElseIf e.Row.RowType = DataControlRowType.Footer
      ... Display the summary data in the footer ...
    End If
End Sub

すべてのデータ行が追加された後、フッター行が GridView に追加されるため、フッターにサマリー データを表示する準備が整うまでに、実行中の合計計算が完了したと確信できます。 最後の手順では、フッターのセルにこれらの値を設定します。

特定のフッター セルにテキストを表示するには、 を使用 e.Row.Cells(index).Text = valueします。ここで、インデックス作成は Cells 0 から始まります。 次のコードは、平均価格 (合計価格を製品数で割った値) を計算し、GridView の適切なフッター セルに在庫単位と単位数の合計と共に表示します。

Protected Sub ProductsInCategory_RowDataBound _
    (sender As Object, e As GridViewRowEventArgs) _
        Handles ProductsInCategory.RowDataBound
    If e.Row.RowType = DataControlRowType.DataRow Then
      ... <i>Increment the running totals</i> ...
    ElseIf e.Row.RowType = DataControlRowType.Footer
      Dim avgUnitPrice As Decimal = _
        _totalUnitPrice / CType(_totalNonNullUnitPriceCount, Decimal)
      e.Row.Cells(1).Text = "Avg.: " & avgUnitPrice.ToString("c")
      e.Row.Cells(2).Text = "Total: " & _totalUnitsInStock.ToString()
      e.Row.Cells(3).Text = "Total: " & _totalUnitsOnOrder.ToString()
    End If
End Sub

図 13 は、このコードが追加された後のレポートを示しています。 によって、平均価格の概要情報が通貨のように書式設定される方法 ToString("c") に注意してください。

通貨として書式設定された GridView のフッター行の概要データを示すスクリーンショット。

図 13: GridView のフッター行に赤みがかった背景色が表示されるようになりました (フルサイズの画像を表示する をクリックします)

まとめ

概要データの表示は一般的なレポート要件であり、GridView コントロールを使用すると、そのような情報をフッター行に簡単に含めることができます。 フッター行は、GridView ShowFooter の プロパティが に設定されている場合に True 表示され、イベント ハンドラーを使用してセル内のテキストを RowDataBound プログラムによって設定できます。 概要データの計算は、データベースの再クエリを実行するか、ASP.NET ページの分離コード クラスのコードを使用して、サマリー データをプログラムで計算することによって行うことができます。

このチュートリアルでは、GridView、DetailsView、および FormView コントロールを使用したカスタム書式設定の検討を終了します。 次のチュートリアルでは、これらの同じコントロールを使用してデータを挿入、更新、削除する方法について説明します。

幸せなプログラミング!

著者について

7 冊の ASP/ASP.NET 書籍の著者であり、 4GuysFromRolla.com の創設者である Scott Mitchell は、1998 年から Microsoft Web テクノロジと協力しています。 Scott は独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズ・ティーチ・自分自身 ASP.NET 24時間で2.0です。 にアクセスmitchell@4GuysFromRolla.comすることも、ブログを介して アクセスすることもできます。これは でhttp://ScottOnWriting.NET確認できます。