データに基づくカスタム書式設定 (C#)

作成者: Scott Mitchell

PDF のダウンロード

GridView、DetailsView、または FormView の形式を、バインドされたデータに基づいて調整するには、複数の方法で行うことができます。 このチュートリアルでは、DataBound イベント ハンドラーと RowDataBound イベント ハンドラーを使用して、データ バインド形式を実現する方法について説明します。

はじめに

GridView、DetailsView、および FormView コントロールの外観は、さまざまなスタイル関連プロパティを使用してカスタマイズできます。 、Font、、BorderWidthBorderStyleBorderColorWidthHeightなどのCssClassプロパティは、レンダリングされたコントロールの一般的な外観を決定します。 、、RowStyleAlternatingRowStyle、 などのHeaderStyleプロパティを使用すると、これらの同じスタイル設定を特定のセクションに適用できます。 同様に、これらのスタイル設定はフィールド レベルで適用できます。

ただし、多くのシナリオでは、書式設定の要件は表示されるデータの値によって異なります。 たとえば、在庫切れの製品に注意を引くために、製品情報を示すレポートでは、フィールドと UnitsOnOrder フィールドの両方が 0 に等しい製品UnitsInStockの背景色を黄色に設定する場合があります。 より高価な製品を強調するために、75.00ドルを超える製品の価格を太字で表示することができます。

GridView、DetailsView、または FormView の形式を、バインドされたデータに基づいて調整するには、複数の方法で行うことができます。 このチュートリアルでは、 イベント ハンドラーと RowDataBound イベント ハンドラーを使用DataBoundして、データ バインド形式を実現する方法について説明します。 次のチュートリアルでは、別の方法について説明します。

DetailsView コントロールのイベント ハンドラーのDataBound使用

データがデータ ソース コントロールから、またはプログラムによってコントロールの プロパティにデータを割り当て、そのDataBind()メソッドを呼び出すことによって DetailsView にDataSourceバインドされると、次の一連の手順が実行されます。

  1. データ Web コントロールのイベントが DataBinding 発生します。
  2. データはデータ Web コントロールにバインドされます。
  3. データ Web コントロールのイベントが DataBound 発生します。

カスタム ロジックは、手順 1 と 3 の直後にイベント ハンドラーを介して挿入できます。 イベントのイベント ハンドラー DataBound を作成することで、データ Web コントロールにバインドされているデータをプログラムで決定し、必要に応じて書式設定を調整できます。 これを説明するために、製品に関する一般的な情報を一覧表示する DetailsView を作成しますが、値が $75.00 を超える場合は太字の斜体フォントで表示されますUnitPrice

手順 1: DetailsView で製品情報を表示する

フォルダー内のページをCustomColors.aspxCustomFormatting開き、ツールボックスからDesignerに DetailsView コントロールをドラッグし、そのIDプロパティ値を にExpensiveProductsPriceInBoldItalic設定して、クラスのGetProducts()メソッドを呼び出す新しい ObjectDataSource コントロールにProductsBLLバインドします。 これを行う詳細な手順は、前のチュートリアルで詳しく調べたため、簡潔にするためにここでは省略します。

ObjectDataSource を DetailsView にバインドしたら、少し時間を取ってフィールド リストを変更します。 、および BoundFields をProductIDUnitsInStockCategoryIDUnitsOnOrderSupplierIDReorderLevel削除し、残りの BoundFields の名前を変更して再フォーマットしました。Discontinued と のWidthHeight設定もクリアしました。 DetailsView には 1 つのレコードのみが表示されるため、エンド ユーザーがすべての製品を表示できるようにするには、ページングを有効にする必要があります。 これを行うには、DetailsView のスマート タグで [ページングを有効にする] チェック ボックスをオンにします。

DetailsView のスマート タグで [ページングを有効にする] チェック ボックスをオンにします

図 1: DetailsView のスマート タグの [ページングを有効にする] チェック ボックスをオンにします (フルサイズの画像を表示する場合はクリックします)

これらの変更後、DetailsView マークアップは次のようになります。

<asp:DetailsView ID="DetailsView1" runat="server" AllowPaging="True"
    AutoGenerateRows="False" DataKeyNames="ProductID"
    DataSourceID="ObjectDataSource1" EnableViewState="False">
    <Fields>
        <asp:BoundField DataField="ProductName" HeaderText="Product"
          SortExpression="ProductName" />
        <asp:BoundField DataField="CategoryName" HeaderText="Category"
          ReadOnly="True" SortExpression="CategoryName" />
        <asp:BoundField DataField="SupplierName" HeaderText="Supplier"
          ReadOnly="True" SortExpression="SupplierName" />
        <asp:BoundField DataField="QuantityPerUnit"
          HeaderText="Qty/Unit" SortExpression="QuantityPerUnit" />
        <asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}"
          HeaderText="Price"
            HtmlEncode="False" SortExpression="UnitPrice" />
    </Fields>
</asp:DetailsView>

しばらくお使いのブラウザーでこのページをテストしてください。

DetailsView コントロールには、一度に 1 つの製品が表示されます

図 2: DetailsView コントロールに一度に 1 つの製品が表示される (フルサイズの画像を表示する場合はクリックします)

手順 2: DataBound イベント ハンドラー内のデータの値をプログラムで決定する

値が $75.00 を超える製品 UnitPrice の太字の斜体フォントで価格を表示するには、まずプログラムで値を UnitPrice 決定できる必要があります。 DetailsView の場合、これはイベント ハンドラーで DataBound 実行できます。 イベント ハンドラーを作成するには、Designerで DetailsView をクリックし、プロパティ ウィンドウに移動します。 表示されていない場合は F4 キーを押して表示するか、[表示] メニューに移動して [プロパティ ウィンドウ] メニュー オプションを選択します。 プロパティ ウィンドウから稲妻アイコンをクリックして DetailsView のイベントを一覧表示します。 次に、イベントを DataBound ダブルクリックするか、作成するイベント ハンドラーの名前を入力します。

DataBound イベントのイベント ハンドラーを作成する

図 3: イベントのイベント ハンドラーを作成するDataBound

これにより、イベント ハンドラーが自動的に作成され、追加されたコード部分に移動します。 この時点で、次の情報が表示されます。

protected void ExpensiveProductsPriceInBoldItalic_DataBound(object sender, EventArgs e)
{

}

DetailsView にバインドされたデータには、 プロパティを DataItem 使用してアクセスできます。 厳密に型指定された DataRow インスタンスのコレクションで構成される、厳密に型指定された DataTable にコントロールをバインドしていることを思い出してください。 DataTable が DetailsView にバインドされると、DataTable の最初の DataRow が DetailsView の DataItem プロパティに割り当てられます。 具体的には、 プロパティには DataItem オブジェクトが割り当てられます DataRowView 。 の Row プロパティをDataRowView使用して、基になる DataRow オブジェクト (実際ProductsRowにはインスタンス) にアクセスできます。 この ProductsRow インスタンスを取得したら、オブジェクトのプロパティ値を検査するだけで決定できます。

次のコードは、DetailsView コントロールにバインドされている値が $75.00 より大きいかどうかを UnitPrice 判断する方法を示しています。

protected void ExpensiveProductsPriceInBoldItalic_DataBound(object sender, EventArgs e)
{
    // Get the ProductsRow object from the DataItem property...
    Northwind.ProductsRow product = (Northwind.ProductsRow)
        ((DataRowView)ExpensiveProductsPriceInBoldItalic.DataItem).Row;
    if (!product.IsUnitPriceNull() && product.UnitPrice > 75m)
    {
        // TODO: Make the UnitPrice text bold and italic
    }
}

注意

データベースに値をNULL含めることができるのUnitPriceで、まず、 の プロパティにアクセスする前に値をNULL処理していないことを確認するProductsRowUnitPriceチェック。 このチェックは重要です。値がある場合に プロパティにアクセスUnitPriceしようとすると、ProductsRowオブジェクトは NULLStrongTypingException 例外をスローするためです。

手順 3: DetailsView で UnitPrice 値を書式設定する

この時点で、DetailsView にバインドされた値が $75.00 を超える値を持っているかどうかを UnitPrice 判断できますが、プログラムによって DetailsView の書式設定を適切に調整する方法はまだ確認できません。 DetailsView の行全体の書式を変更するには、 を使用して DetailsViewID.Rows[index]行にプログラムでアクセスします。特定のセルを変更するには、 にアクセスします DetailsViewID.Rows[index].Cells[index]。 行またはセルへの参照を取得したら、スタイル関連のプロパティを設定して外観を調整できます。

プログラムで行にアクセスするには、行のインデックス (0 から始まる) を知っている必要があります。 行は UnitPrice DetailsView の 5 行目で、インデックスは 4 になり、 を使用して ExpensiveProductsPriceInBoldItalic.Rows[4]プログラムでアクセスできるようにします。 この時点で、次のコードを使用して、行のコンテンツ全体を太字の斜体フォントで表示できます。

ExpensiveProductsPriceInBoldItalic.Rows[4].Font.Bold = true;
ExpensiveProductsPriceInBoldItalic.Rows[4].Font.Italic = true;

ただし、これにより、ラベル (Price) と値の 両方 が太字と斜体になります。 値を太字と斜体にしたい場合は、行の 2 番目のセルにこの書式を適用する必要があります。これは次の方法で実行できます。

ExpensiveProductsPriceInBoldItalic.Rows[4].Cells[1].Font.Bold = true;
ExpensiveProductsPriceInBoldItalic.Rows[4].Cells[1].Font.Italic = true;

ここまでのチュートリアルでは、前述のように特定のスタイル プロパティを設定するのではなく、レンダリングされたマークアップとスタイル関連の情報のクリーン分離を維持するためにスタイルシートを使用しているため、代わりに CSS クラスを使用しましょう。 スタイルシートを Styles.css 開き、次の定義で という名前 ExpensivePriceEmphasis の新しい CSS クラスを追加します。

.ExpensivePriceEmphasis
{
    font-weight: bold;
    font-style: italic;
}

次に DataBound 、イベント ハンドラーで、セルの CssClass プロパティを に ExpensivePriceEmphasis設定します。 次のコードは、 DataBound イベント ハンドラー全体を示しています。

protected void ExpensiveProductsPriceInBoldItalic_DataBound(object sender, EventArgs e)
{
    // Get the ProductsRow object from the DataItem property...
    Northwind.ProductsRow product = (Northwind.ProductsRow)
        ((DataRowView)ExpensiveProductsPriceInBoldItalic.DataItem).Row;
    if (!product.IsUnitPriceNull() && product.UnitPrice > 75m)
    {
        ExpensiveProductsPriceInBoldItalic.Rows[4].Cells[1].CssClass =
            "ExpensivePriceEmphasis";
    }
}

価格が $75.00 未満の Chai を表示すると、価格は通常のフォントで表示されます (図 4 を参照)。 ただし、価格が 97.00 ドルの Mishi Kobe Niku を表示すると、価格は太字の斜体フォントで表示されます (図 5 を参照)。

$75.00 未満の価格は標準フォントで表示されます

図 4: $75.00 未満の価格が標準フォントで表示される (フルサイズの画像を表示する をクリックします)

高価な製品の価格は太字で斜体のフォントで表示されます

図 5: 高価な製品の価格が太字、斜体フォントで表示される (フルサイズの画像を表示する をクリックします)

FormView コントロールのイベント ハンドラーのDataBound使用

FormView にバインドされている基になるデータを決定する手順は、DetailsView でイベント ハンドラーを作成 DataBound し、プロパティを DataItem コントロールにバインドされた適切なオブジェクト型にキャストして、続行する方法を決定する手順と同じです。 ただし、FormView と DetailsView は、ユーザー インターフェイスの外観の更新方法によって異なります。

FormView には BoundFields が含まれていないため、コレクションがありません Rows 。 代わりに、FormView はテンプレートで構成されます。テンプレートには、静的 HTML、Web コントロール、およびデータバインド構文の組み合わせを含めることができます。 通常、FormView のスタイルを調整するには、FormView のテンプレート内の 1 つ以上の Web コントロールのスタイルを調整する必要があります。

これを説明するために、FormView を使用して前の例のような製品を一覧表示しますが、今回は製品名と在庫単位のみを表示し、在庫単位が 10 以下の場合は赤いフォントで表示します。

手順 4: FormView で製品情報を表示する

DetailsView の下の CustomColors.aspx ページに FormView を追加し、そのプロパティを IDLowStockedProductsInRed設定します。 FormView を、前の手順で作成した ObjectDataSource コントロールにバインドします。 これにより、FormView の 、EditItemTemplate、および InsertItemTemplate が作成ItemTemplateされます。 と InsertItemTemplateEditItemTemplate削除し、 ItemTemplate と の値のみをProductNameUnitsInStock含むように簡略化します。それぞれの値は、それぞれ適切な名前の Label コントロールに含まれます。 前の例の DetailsView と同様に、FormView のスマート タグの [ページングを有効にする] チェック ボックスもチェックします。

これらの編集後、FormView のマークアップは次のようになります。

<asp:FormView ID="LowStockedProductsInRed" DataKeyNames="ProductID"
    DataSourceID="ObjectDataSource1" AllowPaging="True"
    EnableViewState="False" runat="server">
    <ItemTemplate>
        <b>Product:</b>
        <asp:Label ID="ProductNameLabel" runat="server"
         Text='<%# Bind("ProductName") %>'>
        </asp:Label><br />
        <b>Units In Stock:</b>
        <asp:Label ID="UnitsInStockLabel" runat="server"
          Text='<%# Bind("UnitsInStock") %>'>
        </asp:Label>
    </ItemTemplate>
</asp:FormView>

には次のものが含まれていることに ItemTemplate 注意してください。

  • 静的 HTML テキスト "Product:" と "Units In Stock:" と、 <br /><b> 要素。
  • Web は、2 つの Label コントロールと UnitsInStockLabelを制御しますProductNameLabel
  • Databinding 構文<%# Bind("ProductName") %> および <%# Bind("UnitsInStock") %> 構文。これらのフィールドの値を Label コントロールの Text プロパティに割り当てます。

手順 5: DataBound イベント ハンドラー内のデータの値をプログラムで決定する

FormView のマークアップが完了したら、次の手順では、値が 10 以下かどうかを UnitsInStock プログラムで判断します。 これは、DetailsView の場合とまったく同じ方法で FormView で実行されます。 まず、FormView DataBound のイベントのイベント ハンドラーを作成します。

DataBound イベント ハンドラーを作成する

図 6: イベント ハンドラーを作成するDataBound

イベント ハンドラーで FormView の DataItem プロパティをインスタンスに ProductsRow キャストし、値が赤色のフォントで表示される必要があるかどうかを UnitsInPrice 判断します。

protected void LowStockedProductsInRed_DataBound(object sender, EventArgs e)
{
    // Get the ProductsRow object from the DataItem property...
    Northwind.ProductsRow product = (Northwind.ProductsRow)
        ((DataRowView)LowStockedProductsInRed.DataItem).Row;
    if (!product.IsUnitsInStockNull() && product.UnitsInStock <= 10)
    {
        // TODO: Make the UnitsInStockLabel text red
    }
}

手順 6: FormView の ItemTemplate で UnitsInStockLabel ラベル コントロールを書式設定する

最後の手順では、値が 10 以下の場合に、表示される UnitsInStock 値を赤いフォントで書式設定します。 これを実現するには、 のコントロールにプログラムでItemTemplateアクセスUnitsInStockLabelし、そのテキストが赤で表示されるようにスタイル プロパティを設定する必要があります。 テンプレート内の Web コントロールにアクセスするには、次のような メソッドを FindControl("controlID") 使用します。

WebControlType someName = (WebControlType)FormViewID.FindControl("controlID");

この例では、値UnitsInStockLabelが の Label コントロールIDにアクセスするため、次の値を使用します。

Label unitsInStock =
    (Label)LowStockedProductsInRed.FindControl("UnitsInStockLabel");

Web コントロールへのプログラムによる参照を取得したら、必要に応じてスタイル関連のプロパティを変更できます。 前の例と同様に、 という名前LowUnitsInStockEmphasisの CSS クラスStyles.cssを 作成しました。 このスタイルを Label Web コントロールに適用するには、それに応じてプロパティを CssClass 設定します。

protected void LowStockedProductsInRed_DataBound(object sender, EventArgs e)
{
    // Get the ProductsRow object from the DataItem property...
    Northwind.ProductsRow product = (Northwind.ProductsRow)
        ((DataRowView)LowStockedProductsInRed.DataItem).Row;
    if (!product.IsUnitsInStockNull() && product.UnitsInStock <= 10)
    {
        Label unitsInStock =
            (Label)LowStockedProductsInRed.FindControl("UnitsInStockLabel");

        if (unitsInStock != null)
        {
          unitsInStock.CssClass = "LowUnitsInStockEmphasis";
        }
    }
}

注意

を使用して FindControl("controlID") Web コントロールにプログラムでアクセスし、そのスタイル関連プロパティを設定するテンプレートを書式設定するための構文は、DetailsView コントロールまたは GridView コントロールで TemplateFields を 使用する場合にも使用できます。 次のチュートリアルでは、TemplateFields について調べます。

図 7 は、値が 10 より大きい製品 UnitsInStock を表示する場合の FormView を示し、図 8 の製品の値は 10 未満です。

在庫が十分に大きい製品の場合、カスタム書式は適用されません

図 7: 在庫が十分に大きい製品の場合、カスタム書式は適用されません (フルサイズの画像を表示する をクリックします)

値が 10 以下の製品については、在庫番号の単位が赤で表示されます

図 8: 値が 10 以下の製品については、在庫番号の単位が赤で表示されます (フルサイズの画像を表示する場合はクリックします)

GridViewRowDataBoundのイベントを使用した書式設定

前に、データバインド中に DetailsView と FormView が制御する一連の手順を調べました。 これらの手順をもう一度、リフレッシャーとして見てみましょう。

  1. データ Web コントロールのイベントが DataBinding 発生します。
  2. データはデータ Web コントロールにバインドされます。
  3. データ Web コントロールのイベントが DataBound 発生します。

DetailsView と FormView には、1 つのレコードのみが表示されるため、これら 3 つの簡単な手順で十分です。 GridView では、(最初のレコードだけでなく) バインド されているすべての レコードが表示されます。手順 2 はもう少し複雑です。

手順 2 では、GridView によってデータ ソースが列挙され、レコードごとにインスタンスが GridViewRow 作成され、現在のレコードがバインドされます。 GridView に追加されるたびに GridViewRow 、次の 2 つのイベントが発生します。

  • RowCreated が作成された後に GridViewRow 発生する
  • RowDataBound は、現在のレコードが にバインドされた後に発生します GridViewRow

GridView の場合、次の一連の手順により、データ バインディングがより正確に記述されます。

  1. GridView のイベントが DataBinding 発生します。

  2. データは GridView にバインドされます。

    データ ソース内の各レコードについて

    1. オブジェクトを作成するGridViewRow
    2. イベントを発生させますRowCreated
    3. レコードを にバインドする GridViewRow
    4. イベントを発生させますRowDataBound
    5. コレクションに をGridViewRow追加するRows
  3. GridView のイベントが DataBound 発生します。

GridView の個々のレコードの形式をカスタマイズするには、イベントのイベント ハンドラーを作成する RowDataBound 必要があります。 これを説明するために、各製品の名前、カテゴリ、価格を一覧表示する GridView をページに CustomColors.aspx 追加し、価格が 10.00 ドル未満の製品を黄色の背景色で強調表示します。

手順 7: GridView で製品情報を表示する

前の例の FormView の下に GridView を追加し、そのプロパティを IDHighlightCheapProducts設定します。 ページ上のすべての製品を返す ObjectDataSource が既に存在するため、GridView をそのオブジェクトにバインドします。 最後に、GridView の BoundFields を編集して、製品の名前、カテゴリ、価格のみを含めます。 これらの編集後、GridView のマークアップは次のようになります。

<asp:GridView ID="HighlightCheapProducts" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="ObjectDataSource1"
    EnableViewState="False" runat="server">
    <Columns>
        <asp:BoundField DataField="ProductName" HeaderText="Product"
          SortExpression="ProductName" />
        <asp:BoundField DataField="CategoryName" HeaderText="Category"
          ReadOnly="True" SortExpression="CategoryName" />
        <asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}"
          HeaderText="Price"
            HtmlEncode="False" SortExpression="UnitPrice" />
    </Columns>
</asp:GridView>

図 9 は、ブラウザーから見たときのこの時点までの進行状況を示しています。

GridView Lists各製品の名前、カテゴリ、および価格

図 9: GridView Lists各製品の名前、カテゴリ、および価格 (フルサイズの画像を表示する をクリックします)

手順 8: RowDataBound イベント ハンドラー内のデータの値をプログラムで決定する

ProductsDataTableが GridView にバインドされると、そのProductsRowインスタンスが列挙され、 ごとに ProductsRowGridViewRow が作成されます。 の GridViewRowプロパティが特定ProductRowDataItem に割り当てられ、その後 GridView のRowDataBoundイベント ハンドラーが発生します。 GridView にバインドされている各製品の値を確認 UnitPrice するには、GridView RowDataBound のイベントのイベント ハンドラーを作成する必要があります。 このイベント ハンドラーでは、現在GridViewRowの の値をUnitPrice調べて、その行の書式設定の決定を行うことができます。

このイベント ハンドラーは、FormView および DetailsView と同じ一連の手順を使用して作成できます。

GridView の RowDataBound イベントのイベント ハンドラーを作成する

図 10: GridView のイベントのイベント ハンドラーを RowDataBound 作成する

この方法でイベント ハンドラーを作成すると、次のコードが ASP.NET ページのコード部分に自動的に追加されます。

protected void HighlightCheapProducts_RowDataBound(object sender, GridViewRowEventArgs e)
{

}

イベントがRowDataBound発生すると、イベント ハンドラーは、 という名前Rowのプロパティを持つ 型GridViewRowEventArgsのオブジェクトを 2 番目のパラメーターとして渡されます。 このプロパティは、単にデータバインドされた への GridViewRow 参照を返します。 にバインドされた ProductsRow インスタンスに GridViewRow アクセスするには、次のように プロパティを DataItem 使用します。

protected void HighlightCheapProducts_RowDataBound(object sender, GridViewRowEventArgs e)
{
    // Get the ProductsRow object from the DataItem property...
    Northwind.ProductsRow product = (Northwind.ProductsRow)
        ((System.Data.DataRowView)e.Row.DataItem).Row;
    if (!product.IsUnitPriceNull() && product.UnitPrice < 10m)
    {
        // TODO: Highlight the row yellow...
    }
}

イベント ハンドラーを RowDataBound 使用する場合、GridView はさまざまな種類の行で構成され、このイベント はすべての 行の種類に対して発生することを念頭に置く必要があります。 GridViewRowの型は、そのRowTypeプロパティによって決定でき、使用可能な値のいずれかを持つことができます。

  • DataRow GridView の レコードにバインドされている行 DataSource
  • EmptyDataRow GridView が空の DataSource 場合に表示される行
  • Footer フッター行。GridView の プロパティが ShowFooter に設定されている場合に表示されます true
  • Header ヘッダー行。GridView の ShowHeader プロパティが に設定されている場合に true 表示されます (既定値)
  • Pager ページングを実装する GridView のの場合は、ページング インターフェイスを表示する行
  • Separator GridView には使用されませんが、DataList コントロールと Repeater コントロールのプロパティで RowType 使用されます。今後のチュートリアルで説明する 2 つのデータ Web コントロール

EmptyDataRowHeaderFooter、および 行はレコードにPager関連付DataSourceけられていないため、常にプロパティのnull値をDataItem持ちます。 このため、現在 GridViewRowの の DataItem プロパティを操作する前に、まず を処理 DataRowしていることを確認する必要があります。 これは、 の プロパティをGridViewRowRowType次のようにチェックすることで実現できます。

protected void HighlightCheapProducts_RowDataBound(object sender, GridViewRowEventArgs e)
{
    // Make sure we are working with a DataRow
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // Get the ProductsRow object from the DataItem property...
        Northwind.ProductsRow product = (Northwind.ProductsRow)
            ((System.Data.DataRowView)e.Row.DataItem).Row;
        if (!product.IsUnitPriceNull() && product.UnitPrice < 10m)
        {
          // TODO: Highlight row yellow...
        }
    }
}

手順 9: UnitPrice 値が $10.00 未満の場合に黄色の行を強調表示する

最後の手順では、その行の値が $10.00 未満の場合UnitPriceに、プログラムによって全体GridViewRowを強調表示します。 GridView の行またはセルにアクセスするための構文は、特定のセルにアクセスするために、行GridViewID.Rows[index].Cells[index]全体にアクセスするための DetailsView GridViewID.Rows[index] と同じです。 ただし、イベント ハンドラーが RowDataBound 起動すると、バインドされた GridViewRow データはまだ GridView の Rows コレクションに追加されていません。 したがって、Rows コレクションを使用してイベント ハンドラーから現在 GridViewRowRowDataBound インスタンスにアクセスすることはできません。

GridViewID.Rows[index]代わりに、 を使用してe.Rowイベント ハンドラー内の現在GridViewRowのインスタンスをRowDataBound参照できます。 つまり、イベント ハンドラーから現在 GridViewRow のインスタンスを強調表示するために、次のように RowDataBound 使用します。

e.Row.BackColor = System.Drawing.Color.Yellow;

BackColor プロパティをGridViewRow直接設定するのではなく、CSS クラスの使用に取り組みましょう。 背景色を黄色に設定する という名前 AffordablePriceEmphasis の CSS クラスを作成しました。 完了した RowDataBound イベント ハンドラーは次のとおりです。

protected void HighlightCheapProducts_RowDataBound(object sender, GridViewRowEventArgs e)
{
    // Make sure we are working with a DataRow
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // Get the ProductsRow object from the DataItem property...
        Northwind.ProductsRow product = (Northwind.ProductsRow)
            ((System.Data.DataRowView)e.Row.DataItem).Row;
        if (!product.IsUnitPriceNull() && product.UnitPrice < 10m)
        {
            e.Row.CssClass = "AffordablePriceEmphasis";
        }
    }
}

最も手頃な価格の製品は黄色で強調表示されています

図 11: 最も手頃な価格の製品は黄色で強調表示されています (フルサイズの画像を表示する をクリックします)

まとめ

このチュートリアルでは、コントロールにバインドされたデータに基づいて GridView、DetailsView、および FormView の書式を設定する方法について説明しました。 これを実現するために、 イベントまたは RowDataBound イベントのDataBoundイベント ハンドラーを作成しました。基になるデータは、必要に応じて書式設定の変更と共に調べられました。 DetailsView または FormView にバインドされたデータにアクセスするには、イベント ハンドラーで プロパティをDataItemDataBound使用します。GridView の場合、各GridViewRowインスタンスのDataItemプロパティには、イベント ハンドラーで使用できるその行にバインドされたデータがRowDataBound含まれます。

プログラムによってデータ Web コントロールの書式設定を調整するための構文は、Web コントロールと、書式設定するデータの表示方法によって異なります。 DetailsView コントロールと GridView コントロールの場合、行とセルには序数インデックスでアクセスできます。 テンプレートを使用する FormView の場合、 メソッドは通常、 FindControl("controlID") テンプレート内から Web コントロールを検索するために使用されます。

次のチュートリアルでは、GridView と DetailsView でテンプレートを使用する方法について説明します。 さらに、基になるデータに基づいて書式設定をカスタマイズするための別の手法が表示されます。

プログラミングに満足!

著者について

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

特別な感謝

このチュートリアル シリーズは、多くの役に立つ校閲者によってレビューされました。 このチュートリアルのリード レビュー担当者は、E.R. Gilmore、Dennis Patterson、Dan Jagers でした。 今後の MSDN の記事を確認することに関心がありますか? その場合は、 にmitchell@4GuysFromRolla.com行をドロップしてください。