Поделиться через


Пользовательское форматирование на основе данных (C#)

Скотт Митчелл

Скачать в формате PDF

Настройка формата GridView, DetailsView или FormView на основе данных, привязанных к нему, может выполняться несколькими способами. В этом руководстве мы рассмотрим, как выполнить форматирование привязанных к данным путем использования обработчиков событий DataBound и RowDataBound.

Введение

Внешний вид элементов управления GridView, DetailsView и FormView можно настроить с помощью множество свойств, связанных со стилем. Свойства, такие как CssClass, Font, BorderWidth, BorderStyle, BorderColor, Width и Height, определяют общий внешний вид отображаемого элемента управления. Свойства, включая HeaderStyle, RowStyleAlternatingRowStyleи другие, позволяют применять эти же параметры стиля к определенным разделам. Аналогичным образом эти параметры стиля можно применять на уровне поля.

Однако во многих сценариях требования к форматированию зависят от значения отображаемых данных. Например, чтобы привлечь внимание к продуктам, которые закончились на складе, список информации о продукте в отчете может задать цвет фона желтым для тех продуктов, поля которых UnitsInStock и UnitsOnOrder равны 0. Чтобы выделить более дорогие продукты, мы можем показать цены на эти продукты стоимостью более $ 75,00 в полужирном шрифте.

Настройка формата GridView, DetailsView или FormView на основе данных, привязанных к нему, может выполняться несколькими способами. В этом руководстве мы рассмотрим, как выполнить форматирование, привязанное к данным, с использованием обработчиков событий DataBound и RowDataBound. В следующем руководстве мы рассмотрим альтернативный подход.

Использование обработчикаDataBoundсобытий элемента управления DetailsView

Если данные привязаны к DetailsView, либо из элемента управления источниками данных, либо с помощью программного назначения данных свойству элемента управления DataSource и вызова его DataBind() метода, происходит следующая последовательность шагов:

  1. Событие веб-элемента управления DataBinding данными запускается.
  2. Данные привязаны к веб-элементу управления данными.
  3. Событие веб-элемента управления DataBound данными запускается.

Пользовательская логика может быть внедрена сразу после шагов 1 и 3 через обработчик событий. Создав обработчик событий для DataBound события, можно программно определить данные, привязанные к веб-элементу управления данными, и настроить форматирование по мере необходимости. Чтобы проиллюстрировать это, давайте создадим DetailsView, который будет содержать общие сведения о продукте, но будет отображать UnitPrice значение полужирным, курсивным шрифтом, если он превышает $ 75,00.

Шаг 1. Отображение сведений о продукте в DetailsView

CustomColors.aspx Откройте страницу в папке CustomFormatting, перетащите элемент управления DetailsView из панели элементов в конструктор, задайте значение свойства ID на ExpensiveProductsPriceInBoldItalic и привяжите его к новому элементу управления ObjectDataSource, который вызывает метод ProductsBLL класса GetProducts(). Подробные инструкции по выполнению этой задачи опущены здесь для краткости, так как мы подробно изучили их в предыдущих руководствах.

После привязки ObjectDataSource к DetailsView уделите время изменению списка полей. Я решил удалить ProductID, SupplierID, CategoryID, UnitsInStock, UnitsOnOrder, ReorderLevel и BoundFields, а оставшиеся BoundFields переименовать и переформатировать. Я также очистил настройки Width и Height. Так как в 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. Элемент управления DetailsView отображает один продукт за раз (щелкните, чтобы просмотреть изображение полного размера)

Шаг 2. Программное определение значения данных в обработчике события привязки данных

Чтобы отобразить цену полужирным шрифтом, курсивом для этих продуктов UnitPrice , стоимость которых превышает $ 75,00, нам необходимо сначала иметь возможность программно определить UnitPrice значение. Для DetailsView это можно сделать в обработчике DataBound событий. Чтобы создать обработчик событий, щелкните DetailsView в конструкторе и перейдите в окно "Свойства". Нажмите клавишу F4, чтобы открыть ее, если она не видна, или перейдите в меню "Вид" и выберите пункт меню "Окно свойств". В окне "Свойства" щелкните значок молнии, чтобы получить список событий DetailsView. Затем дважды щелкните событие DataBound или введите имя обработчика событий, который вы хотите создать.

Создайте обработчик событий для события DataBound

Рис. 3. Создание обработчика DataBound событий для события

Это приведет к автоматическому созданию обработчика событий и перенаправит вас в часть кода, в которой она была добавлена. На этом этапе вы увидите следующее:

protected void ExpensiveProductsPriceInBoldItalic_DataBound(object sender, EventArgs e)
{

}

Доступ к данным, привязанным к DetailsView, можно получить через DataItem свойство. Помните, что мы привязываем наши элементы управления к строго типизированной dataTable, которая состоит из коллекции строго типизированных экземпляров DataRow. При привязке DataTable к DetailsView первая строка DataRow в DataTable назначается свойству DataItem элемента DetailsView. В частности, DataItem свойство назначается объекту DataRowView . Мы можем использовать свойство DataRowViewRow, чтобы получить доступ к базовому объекту DataRow, который фактически является экземпляром ProductsRow. Получив этот ProductsRow экземпляр, мы можем принять решение, просто проверив значения свойств объекта.

В следующем коде показано, как определить, имеет ли UnitPrice значение, привязанное к элементу управления DetailsView, больше $ 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, мы сначала проверяем, что значение не является NULL, прежде чем получить доступ к свойству ProductsRowUnitPrice. Эта проверка важна, так как если мы пытаемся получить доступ к свойству UnitPrice, когда оно имеет значение NULL, объект ProductsRow вызовет исключение StrongTypingException.

Шаг 3. Форматирование значения UnitPrice в DetailsView

На этом этапе мы можем определить, имеет ли UnitPrice значение, привязанное к DetailsView, значение, превышающее $ 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;

Однако это сделает полужирными и курсивными как метку (цена), так и значение. Если мы хотим сделать значение только полужирным и курсивным, необходимо применить это форматирование ко второй ячейке в строке, что можно выполнить с помощью следующего:

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

Так как наши учебники до сих пор использовали таблицы стилей для поддержания чистого разделения между отрисовываемой разметкой и сведениями, связанными со стилем, а не задавать определенные свойства стиля, как показано выше, вместо этого будем использовать класс CSS. Откройте таблицу стилей Styles.css и добавьте новый класс CSS с именем ExpensivePriceEmphasis следующего определения:

.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). Однако при просмотре Миши Кобе Нику, которая имеет цену $ 97,00, цена отображается в полужирном, курсивном шрифте (см. рис. 5).

Цены меньше $ 75,00 отображаются в обычном шрифте

Рис. 4. Цены меньше $ 75,00 отображаются в обычном шрифте (щелкните, чтобы просмотреть изображение полного размера)

Цены дорогих продуктов отображаются в полужирном, курсивном шрифте

Рис. 5. Цены на дорогие продукты отображаются в полужирном, курсивном шрифте (щелкните, чтобы просмотреть изображение полного размера)

Использование обработчикаDataBoundсобытий элемента управления FormView

Шаги по определению базовых данных, привязанных к FormView, идентичны шагам для DetailsView: создайте обработчик событий DataBound, приведите свойство DataItem к соответствующему типу объекта, привязанному к элементу управления, и определите дальнейшие действия. Однако элементы пользовательского интерфейса FormView и DetailsView отличаются тем, что касается обновления их внешнего вида.

FormView не содержит BoundFields и поэтому не имеет коллекции Rows. Вместо этого FormView состоит из шаблонов, которые могут содержать сочетание статических HTML, веб-элементов управления и синтаксиса привязки данных. Изменение стиля FormView обычно включает настройку стиля одного или нескольких веб-элементов управления в шаблонах FormView.

Чтобы проиллюстрировать это, давайте будем использовать FormView для перечисления товаров, как в предыдущем примере, но на этот раз давайте отобразим только название товара и количество в запасе, при этом количество в запасе будет отображаться красным шрифтом, если их количество меньше или равно 10.

Шаг 4. Отображение сведений о продукте в FormView

Добавьте FormView на страницу CustomColors.aspx под DetailsView и установите свойство ID в LowStockedProductsInRed. Привязите FormView к элементу управления ObjectDataSource, созданному на предыдущем шаге. Это создаст ItemTemplate, EditItemTemplate и InsertItemTemplate для FormView. Удалите EditItemTemplate и InsertItemTemplate, а затем упростите ItemTemplate, чтобы включать только значения ProductName и UnitsInStock, каждое из которых разместите в своем собственном элементе управления 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>.
  • Веб-элементы управления Label, два элемента управления ProductNameLabel и UnitsInStockLabel.
  • Синтаксис <%# Bind("ProductName") %> и <%# Bind("UnitsInStock") %> синтаксис, который назначает значения из этих полей свойствам элементов управления Text Label.

Шаг 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. Форматирование элемента управления метки UnitsInStockLabel в элементе ItemTemplate FormView

Последним шагом является форматирование отображаемого UnitsInStock значения в красном шрифте, если значение равно 10 или меньше. Для этого необходимо программно получить доступ к контролу UnitsInStockLabel в ItemTemplate и установить его стиль так, чтобы текст отображался красным цветом. Чтобы получить доступ к веб-элементу управления в шаблоне FindControl("controlID") , используйте следующий метод:

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

В нашем примере мы хотим получить доступ к элементу управления Label, значение которого ID имеет значение UnitsInStockLabel, поэтому мы будем использовать:

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

Получив программную ссылку на веб-элемент управления, мы можем изменить его свойства, связанные со стилем, по мере необходимости. Как и в предыдущем примере, я создал класс CSS с Styles.css именем LowUnitsInStockEmphasis. Чтобы применить этот стиль к веб-элементу управления Label, задайте его 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") и последующего задания свойств, связанных с стилем, также можно использовать при использовании TemplateFields в элементах управления DetailsView или GridView. Мы рассмотрим TemplateFields в следующем руководстве.

На рисунке 7 отображается FormView при просмотре продукта, значение которого UnitsInStock больше 10, а продукт на рис. 8 имеет значение менее 10.

Для продуктов с достаточно большими единицами на складе не применяется настраиваемое форматирование

Рис. 7. Для продуктов с достаточно большими единицами в складе не применяется настраиваемое форматирование (щелкните, чтобы просмотреть изображение полного размера)

Количество на складе отображается красным цветом для тех продуктов со значениями 10 или менее

Рис. 8. Количество на складе отображается в красном цвете для продуктов со значением 10 или меньше (Нажмите, чтобы просмотреть изображение полного размера)

Форматирование с помощью события GridViewRowDataBound

Ранее мы изучили последовательность шагов, выполняемых элементами управления DetailsView и FormView во время привязки данных. Давайте рассмотрим эти шаги еще раз для освежения памяти.

  1. Событие веб-элемента управления DataBinding данными запускается.
  2. Данные привязаны к веб-элементу управления данными.
  3. Событие веб-элемента управления DataBound данными запускается.

Эти три простых шага достаточно для DetailsView и FormView, так как они отображают только одну запись. Для GridView, который отображает все записи, привязанные к нему (а не только первую), шаг 2 немного сложнее.

На шаге 2 GridView перечисляет источник данных и для каждой записи создает экземпляр и привязывает текущую GridViewRow запись к ней. Для каждого GridViewRow добавленного в GridView создаются два события:

  • 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

Добавьте GridView под FormView из предыдущего примера и установите свойство ID на HighlightCheapProducts. Так как у нас уже есть ObjectDataSource, который возвращает все продукты на странице, привязывает GridView к ней. Наконец, отредактируйте BoundFields в GridView, чтобы включить только названия, категории и цены продуктов. После этих изменений разметка 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 перечисляются, и для каждого экземпляра ProductsRow создается GridViewRow. Свойство GridViewRowприсваивается DataItem конкретному ProductRowобъекту, после чего вызывается обработчик событий GridView RowDataBound . Чтобы определить UnitPrice значение для каждого продукта, привязанного к GridView, необходимо создать обработчик событий для события GridView RowDataBound . В этом обработчике событий можно проверить UnitPrice значение текущего GridViewRow и определить формат для этой строки.

Этот обработчик событий можно создать с помощью той же серии шагов, что и FormView и DetailsView.

Создание обработчика событий для события RowDataBound в GridView

Рис. 10. Создание обработчика событий для события GridView RowDataBound

Создание обработчика событий таким образом приведет к автоматическому добавлению следующего кода в часть кода страницы ASP.NET:

protected void HighlightCheapProducts_RowDataBound(object sender, GridViewRowEventArgs e)
{

}

Когда событие RowDataBound запускается, в качестве второго параметра передается обработчик событий — объект типа GridViewRowEventArgs, который имеет свойство с именем Row. Это свойство возвращает ссылку на 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 строка заголовка; отображается, если для свойства ShowHeader GridView задано значение true (по умолчанию)
  • Pager Для GridView'ов, которые реализуют разбиение по страницам, строка, отображающая интерфейс разбиения по страницам
  • Separator не используется для GridView, но используется RowType свойствами для элементов управления DataList и Repeater, два веб-элемента управления данных мы обсудим в будущих руководствах.

Так как строки EmptyDataRow, Header, Footer и Pager не связаны с записью DataSource, они всегда будут иметь значение null для свойства DataItem. По этой причине, прежде чем пытаться работать с текущим GridViewRowDataItem свойством, сначала необходимо убедиться, что мы имеем дело с DataRow. Это можно сделать, проверив свойство GridViewRow следующим образом: RowType

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: выделение строки желтым, когда цена за единицу меньше $10,00.

Последний шаг заключается в программном выделении всего элемента GridViewRow, если значение UnitPrice для этой строки меньше $10,00. Синтаксис доступа к строкам или ячейкам GridView такой же, как и в DetailsView: GridViewID.Rows[index] для доступа ко всей строке, GridViewID.Rows[index].Cells[index] для доступа к определенной ячейке. Однако, когда срабатывает обработчик событий RowDataBound, привязанная GridViewRow данных еще не добавлена в коллекцию Rows GridView. Поэтому невозможно получить доступ к текущему GridViewRow экземпляру из обработчика RowDataBound событий с помощью коллекции строк.

Вместо GridViewID.Rows[index] можно в обработчике событий GridViewRow ссылаться на текущий экземпляр RowDataBound с помощью e.Row. То есть для выделения текущего GridViewRow экземпляра из обработчика RowDataBound событий мы будем использовать:

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

Вместо того чтобы напрямую задавать свойство GridViewRowBackColor, давайте будем использовать классы CSS. Я создал класс CSS с именем AffordablePriceEmphasis , который задает цвет фона желтым. Завершённый обработчик события 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 на основе данных, привязанных к элементу управления. Для этого мы создали обработчик событий для DataBound событий или RowDataBound событий, где базовые данные были проверены вместе с изменением форматирования при необходимости. Чтобы получить доступ к данным, привязанным к DetailsView или FormView, мы используем DataItem свойство в DataBound обработчике событий. Для свойства GridView каждый GridViewRow экземпляр DataItem содержит данные, привязанные к этой строке, которая доступна в обработчике RowDataBound событий.

Синтаксис для программной настройки форматирования веб-элемента управления данными зависит от веб-элемента управления и способа отображения данных. Для элементов управления DetailsView и GridView строки и ячейки можно получить с помощью порядкового индекса. Для FormView, использующего шаблоны, FindControl("controlID") метод обычно используется для поиска веб-элемента управления из шаблона.

В следующем руководстве мы рассмотрим, как использовать шаблоны с GridView и DetailsView. Кроме того, мы увидим еще один способ настройки форматирования на основе базовых данных.

Счастливое программирование!

Сведения о авторе

Скотт Митчелл, автор семи книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с технологиями Microsoft Web с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга — Sams Teach Yourself ASP.NET 2.0 за 24 часа. С ним можно связаться по адресу mitchell@4GuysFromRolla.com.

Особое спасибо кому

Эта серия учебников была проверена многими полезными рецензентами. Ведущими рецензентами этого руководства являлись Э.Р. Гилмор, Деннис Паттерсон и Дэн Джагерс. Хотите просмотреть мои предстоящие статьи MSDN? Если да, напишите мне на mitchell@4GuysFromRolla.com.