根據資料自訂格式設定 (C#)

作者 :Scott Mitchell

下載 PDF

根據系結至 GridView、DetailsView 或 FormView 的數據調整格式,可以透過多種方式完成。 在本教學課程中,我們將探討如何使用DataBound和RowDataBound事件處理程式來完成數據系結格式設定。

簡介

GridView、DetailsView 和 FormView 控件的外觀可以透過各種樣式相關屬性來自定義。 CssClassFont、、BorderWidthBorderStyleBorderColorWidthHeight等屬性會決定轉譯控件的一般外觀。 包括 HeaderStyleRowStyleAlternatingRowStyle和其他屬性的屬性允許將這些相同的樣式設定套用至特定區段。 同樣地,這些樣式設定可以在欄位層級套用。

不過,在許多情況下,格式需求取決於所顯示數據的值。 例如,若要吸引注意庫存產品,清單產品資訊的報表可能會將和UnitsOnOrder字段都等於 0 的產品,將背景色彩設定為UnitsInStock黃色。 為了反白顯示較昂貴的產品,我們可能會想要以粗體字型顯示那些成本超過 $75.00 的產品價格。

根據系結至 GridView、DetailsView 或 FormView 的數據調整格式,可以透過多種方式完成。 在本教學課程中,我們將探討如何使用 和 RowDataBound 事件處理程式來完成數據系結格式DataBound設定。 在下一個教學課程中,我們將探索替代方法。

使用 DetailsView 控件的DataBound事件處理程式

當數據系結至 DetailsView 時,請從數據源控件,或透過以程式設計方式將數據指派給控件的 DataSource 屬性並呼叫其 DataBind() 方法,會發生下列一連串的步驟:

  1. 引發數據 Web 控制件 DataBinding 的事件。
  2. 數據系結至數據 Web 控制件。
  3. 引發數據 Web 控制件 DataBound 的事件。

您可以透過事件處理程式,在步驟 1 和 3 之後立即插入自定義邏輯。 藉由建立事件的事件處理程式, DataBound 我們可以以程式設計方式判斷已系結至數據 Web 控件的數據,並視需要調整格式設定。 為了說明這一點,讓我們建立一個 DetailsView 來列出產品的一般資訊,但如果其超過 $75.00,則會以粗體斜體字型顯示UnitPrice此值。

步驟 1:在 DetailsView 中顯示產品資訊

CustomColors.aspx開啟資料夾中的頁面CustomFormatting,將DetailsView控件從 [工具箱] 拖曳到 Designer,將其ID屬性值設定為 ExpensiveProductsPriceInBoldItalic,並將其系結至叫用ProductsBLL類別方法GetProducts()的新 ObjectDataSource 控件。 為了簡潔起見,這裡省略完成此作業的詳細步驟,因為我們在先前的教學課程中詳加檢查這些步驟。

將 ObjectDataSource 系結至 DetailsView 之後,請花一點時間修改字段清單。 我選擇移除 ProductIDSupplierIDCategoryIDUnitsInStockUnitsOnOrder、、 ReorderLevelDiscontinued BoundFields,並重新命名並重新格式化其餘 BoundFields。 我也會清除 WidthHeight 設定。 由於 DetailsView 只會顯示單一記錄,因此我們必須啟用分頁,才能讓用戶檢視所有產品。 若要這樣做,請核取 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 控件一次顯示一個產品

圖 2:D etailsView 控件一次顯示一個產品, (按兩下即可檢視完整大小的影像)

步驟 2:以程式設計方式判斷 DataBound 事件處理程式中的數據值

為了以粗體、斜體字型 UnitPrice 顯示值超過 $75.00 的產品價格,我們必須先能夠以程序設計方式判斷 UnitPrice 值。 針對 DetailsView,這可以在事件處理程式中 DataBound 完成。 若要建立事件處理程式,請按兩下 Designer中的DetailsView,然後流覽至 屬性視窗。 按 F4 以顯示它,如果看不到,或移至 [檢視] 功能表,然後選取 [屬性視窗] 選單選項。 從 屬性視窗 按兩下閃電圖示,以列出DetailsView的事件。 接下來,按兩下 DataBound 事件,或輸入您想要建立的事件處理程式名稱。

建立 DataBound 事件的事件處理程式

圖 3:建立事件的事件處理程式DataBound

這麼做會自動建立事件處理程式,並帶您前往已新增事件處理程序的程序代碼部分。 此時您會看到:

protected void ExpensiveProductsPriceInBoldItalic_DataBound(object sender, EventArgs e)
{

}

系結至 DetailsView 的數據可以透過 DataItem 屬性存取。 回想一下,我們要將控件系結至強型別 DataTable,由強型別 DataRow 實例集合所組成。 當 DataTable 系結至 DetailsView 時,DataTable 中的第一個 DataRow 會指派給 DetailsView 的 DataItem 屬性。 具體而言,屬性 DataItem 會指派 物件 DataRowView 。 我們可以使用 DataRowViewRow 屬性來取得基礎 DataRow 物件的存取權,這實際上是 ProductsRow 實例。 有了這個 ProductsRow 實例之後,我們只要檢查對象的屬性值即可做出決策。

下列程式代碼說明如何判斷系結至 DetailsView 控件的值是否 UnitPrice 大於 $75.00:

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

注意

由於 UnitPrice 在資料庫中可以有值NULL,因此我們會先檢查以確定在存取 ProductsRowUnitPrice 屬性之前,不會處理NULL值。 這項檢查很重要,因為如果我們嘗試在屬性具有NULL值時存取UnitPrice屬性,ProductsRow物件將會擲回 StrongTypingException 例外狀況

步驟 3:格式化 DetailsView 中的 UnitPrice 值

此時,我們可以判斷系結至 DetailsView 的值是否 UnitPrice 具有超過 $75.00 的值,但我們尚未瞭解如何以程式設計方式調整 DetailsView 的格式。 若要修改 DetailsView 中整個資料列的格式設定,請使用 以程式設計方式存取資料列 DetailsViewID.Rows[index];若要修改特定儲存格,請使用 DetailsViewID.Rows[index].Cells[index]。 一旦我們有數據列或儲存格的參考,就可以藉由設定其樣式相關屬性來調整其外觀。

以程序設計方式存取數據列需要您知道數據列的索引,從 0 開始。 此 UnitPrice 數據列是 DetailsView 中的第五個數據列,提供其索引為 4,並使用 以程式設計方式存取 ExpensiveProductsPriceInBoldItalic.Rows[4]。 此時,我們可以使用下列程式代碼,以粗體斜體字型顯示整個數據列的內容:

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

不過, 這會讓標籤 (Price) 和粗體和斜體值。 如果我們想要將值設為粗體且斜體,我們需要將此格式套用至數據列中的第二個單元格,這可以使用下列專案來完成:

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

因為我們的教學課程到目前為止已使用樣式表單來維護轉譯標記與樣式相關信息之間的全新分隔,而不是設定特定的樣式屬性,如上所示,讓我們改用 CSS 類別。 Styles.css開啟 stylesheet,並新增名為 且具有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";
    }
}

檢視 Chai 的成本低於 $75.00 時,價格會顯示在標準字型中, (請參閱圖 4) 。 不過,在檢視Mishi您的Niku,其價格為 $97.00時,價格會以粗體斜體字型顯示, (請參閱圖 5) 。

小於 $75.00 的價格會顯示在一般字型中

圖 4:低於 $75.00 的價格會顯示在一般字型 (按兩下即可檢視完整大小的影像)

昂貴的產品價格會以粗體、斜體字型顯示

圖 5:昂貴的產品價格會顯示在粗體、斜體字型 (按兩下以檢視完整大小的影像)

使用 FormView 控件的DataBound事件處理程式

判斷系結至 FormView 之基礎數據的步驟與 DetailsView 建立 DataBound 事件處理程式的步驟相同、將 DataItem 屬性轉換成系結至控件的適當物件類型,以及決定如何繼續。 不過,FormView 和 DetailsView 在更新其使用者介面的外觀上有所不同。

FormView 不包含任何 BoundFields,因此缺少 Rows 集合。 相反地,FormView 是由範本所組成,可以包含靜態 HTML、Web 控件和數據系結語法的混合。 調整 FormView 的樣式通常牽涉到調整 FormView 範本中一或多個 Web 控件的樣式。

為了說明這一點,讓我們使用 FormView 來列出如上一個範例中的產品,但這次讓我們只顯示產品名稱和庫存單位,如果其小於或等於 10,則以紅色字型顯示的庫存單位。

步驟 4:在 FormView 中顯示產品資訊

將 FormView 新增至 CustomColors.aspx DetailsView 下方的頁面,並將其 ID 屬性設定為 LowStockedProductsInRed。 將 FormView 系結至從上一個步驟建立的 ObjectDataSource 控件。 這會為 FormView 建立 ItemTemplateEditItemTemplateInsertItemTemplateEditItemTemplate拿掉 和 InsertItemTemplate ,並簡化 ItemTemplate 以只ProductName包含 和 UnitsInStock 值,每個值都有自己的適當命名標籤件。 如同先前範例中的 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 控制 兩個 Label 控制件與 ProductNameLabelUnitsInStockLabel
  • 數據系結語法<%# Bind("ProductName") %><%# Bind("UnitsInStock") %> 語法,會將這些欄位的值指派給 Label 控件 Text 的屬性。

步驟 5:以程式設計方式判斷 DataBound 事件處理程式中的數據值

當 FormView 的標記完成時,下一個步驟是以程式設計方式判斷值是否 UnitsInStock 小於或等於 10。 這與 FormView 與 DetailsView 完全相同的方式完成。 首先,建立 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 的值格式化為紅色字型。 若要達成此目的,我們需要以程序設計方式存取 UnitsInStockLabel 中的 ItemTemplate 控件,並設定其樣式屬性,使其文字以紅色顯示。 若要存取範本中的 Web 控制件,請使用 FindControl("controlID") 如下所示的方法:

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

在我們的範例中,我們想要存取值為 UnitsInStockLabelID標籤,因此我們會使用:

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

一旦我們有 Web 控件的程式設計參考,就可以視需要修改其樣式相關屬性。 如同先前的範例,我已在名為 LowUnitsInStockEmphasisStyles.css建立 CSS 類別。 若要將此樣式套用至標籤 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";
        }
    }
}

注意

在 DetailsView 或 GridView 控件中使用 TemplateFields 時,也可以使用以程式設計方式存取 Web 控件FindControl("controlID")的語法,然後設定其樣式相關屬性。 我們將在下一個教學課程中檢查 TemplateFields。

圖 7 顯示當檢視值為大於 10 的產品 UnitsInStock 時,FormView,而圖 8 中的產品的值小於 10。

對於內含足夠大型單位的產品,不會套用任何自定義格式設定

圖 7:對於內含足夠大型單位的產品,不會套用任何自定義格式 (按兩下即可檢視大小完整的影像)

庫存單位會針對值為 10 或更少的產品以紅色顯示

圖 8:庫存單位在紅色中針對值為 10 或更少 (按兩下以檢視全尺寸影像)

使用 GridView 的事件RowDataBound格式化

稍早我們已檢查 DetailsView 和 FormView 控件在數據系結期間進行的步驟順序。 讓我們以重新整理方式再次查看這些步驟。

  1. 數據 Web 控制件的事件 DataBinding 會引發。
  2. 數據系結至數據 Web 控制件。
  3. 數據 Web 控制件的事件 DataBound 會引發。

這三個簡單的步驟就足以用於 DetailsView 和 FormView,因為它們只會顯示單一記錄。 針對 GridView,這會顯示系結至 (它 的所有 記錄,而不只是第一個) ,步驟 2 會更相關。

在步驟 2 中,GridView 會列舉數據源,並針對每個記錄建立 GridViewRow 實例,並將目前的記錄系結至該實例。 針對新增至 GridView 的每個 GridViewRow 事件,都會引發兩個事件:

  • 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,並將其 ID 屬性設定為 HighlightCheapProducts。 由於我們已經有一個 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 清單 每個產品的名稱、類別和價格

圖 9:GridView 清單 [每個產品的名稱]、[類別] 和 [價格] (按兩下即可檢視大小完整的影像)

步驟 8:以程式設計方式判斷 RowDataBound 事件處理程式中的數據值

ProductsDataTable當 系結至 GridView 時,會列舉其ProductsRow實例,並建立每個 ProductsRowGridViewRow 實例。 GridViewRowDataItem 屬性會指派給特定的 ProductRow,之後會引發 GridView 的RowDataBound事件處理程式。 若要判斷 UnitPrice 系結至 GridView 的每個產品值,我們需要建立 GridView 事件的 RowDataBound 事件處理程式。 在此事件處理程式中,我們可以檢查 UnitPrice 目前 GridViewRow 的值,並針對該數據列做出格式設定決策。

您可以使用與 FormView 和 DetailsView 相同的一系列步驟來建立此事件處理程式。

為 GridView 的 RowDataBound 事件建立事件處理程式

圖 10:建立 GridView 事件的 RowDataBound 事件處理程式

以此方式建立事件處理程式會導致下列程式代碼自動新增至頁面的程式代碼部分 ASP.NET:

protected void HighlightCheapProducts_RowDataBound(object sender, GridViewRowEventArgs e)
{

}

RowDataBound引發事件時,事件處理程式會當做其第二個參數傳遞為 類型GridViewRowEventArgs的物件,其具有名為Row的屬性。 這個屬性會傳回只系結數據之 GridViewRow 的參考。 若要存取ProductsRow系結至 的 實例,GridViewRowDataItem請使用 屬性,如下所示:

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,但由 RowType DataList 和 Repeater 控件的屬性使用,我們將在未來的教學課程中討論兩個數據 Web 控件

EmptyDataRow由於、 HeaderFooter和數據Pager列並未與DataSource記錄相關聯,因此它們一律會有nullDataItem 屬性的值。 基於這個理由,在嘗試使用目前 GridViewRowDataItem 的屬性之前,我們必須先確定我們正在處理 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 時,醒目提示列黃色

最後一個步驟是,如果該UnitPrice數據列的值小於 $10.00,則以程序設計方式反白顯示整個GridViewRow。 存取 GridView 數據列或儲存格的語法與 DetailsView GridViewID.Rows[index] 存取整個數據列的語法相同, GridViewID.Rows[index].Cells[index] 以存取特定儲存格。 不過,當 RowDataBound 事件處理程式引發數據系結 GridViewRow 尚未新增至 GridView 的 Rows 集合時。 因此,您無法使用 Rows 集合,從RowDataBound事件處理程式存取目前的GridViewRow實例。

GridViewID.Rows[index]我們可以使用 參考事件處理程式e.Row中的RowDataBound目前GridViewRow實例,而不是 。 也就是說,為了從RowDataBound事件處理程式反白顯示目前的GridViewRow實例,我們會使用:

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

我們不要直接設定 GridViewRowBackColor 屬性,而是使用 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。 為了達成此目的,我們會針對 DataBoundRowDataBound 事件建立事件處理程式,並視需要檢查基礎數據以及格式變更。 若要存取系結至 DetailsView 或 FormView 的數據,我們會在事件處理程式中使用 DataItemDataBound 屬性;對於 GridView,每個 GridViewRow 實例 DataItem 的 屬性都包含系結至該數據列的數據,該數據列可在事件處理程式中使用 RowDataBound

以程式設計方式調整數據 Web 控件格式的語法取決於 Web 控件,以及要如何顯示格式化的數據。 如需 DetailsView 和 GridView 控件,數據列和儲存格可由序數索引存取。 對於使用範本的 FormView, FindControl("controlID") 方法通常用來從範本內尋找 Web 控件。

在下一個教學課程中,我們將探討如何搭配 GridView 和 DetailsView 使用範本。 此外,我們也會看到另一種根據基礎數據自定義格式設定的技術。

快樂的程序設計!

關於作者

Scott Mitchell 是 1998 年以來,1998 年與 Microsoft Web 技術合作的 篇 ASP/ASP.NET 書籍和 4GuysFromRolla.com 作者。 Scott 是獨立的顧問、訓練者和作者。 他的最新書籍是 Sams 在 24 小時內自行 ASP.NET 2.0。 您可以透過mitchell@4GuysFromRolla.com部落格連到,也可以透過其部落格來存取,網址為 http://ScottOnWriting.NET

特別感謝

本教學課程系列是由許多實用的檢閱者所檢閱。 本教學課程的首席檢閱者是 E.R.Gilmore、Dennis Patterson 和 Dan Jagers。 想要檢閱即將推出的 MSDN 文章嗎? 如果是,請將一行放在 mitchell@4GuysFromRolla.com。