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

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

Скачивание примера приложения или Загрузка PDF-файла

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

Введение

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

Во многих случаях требования к форматированию зависят от значения отображаемых данных. Например, чтобы привлечь внимание к небольшим запасным продуктам, отчет, перечисляющий сведения о продукте, может установить желтый цвет фона для тех продуктов, чьи 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и Discontinued BoundFields, а также переименование и повторное форматирование оставшихся BoundFields. Я также очистил параметры Width и Height. Так как 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. элемент управления DetailsView отображает по одному продукту за раз (щелкните, чтобы просмотреть изображение с полным размером)

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

Чтобы отобразить цену с полужирным шрифтом, курсивом для тех продуктов, значение которых 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. Можно использовать свойство Row DataRowView, чтобы получить доступ к базовому объекту 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
    }
}

Note

Поскольку UnitPrice может иметь NULL значение в базе данных, сначала убедитесь, что мы не работаем с NULL значением, прежде чем обращаться к свойству UnitPrice ProductsRow. Эта проверка важна, поскольку при попытке получить доступ к свойству 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;

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

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 бирж:" вместе с элементами <br /> и <b>.
  • Веб-элементы управления имеют два элемента управления Label: ProductNameLabel и UnitsInStockLabel.
  • Синтаксис привязки данных синтаксис <%# Bind("ProductName") %> и <%# Bind("UnitsInStock") %>, который присваивает значения из этих полей свойствам элемента управления Label "Text".

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

После завершения разметки FormView, следующим шагом является программное определение того, является ли значение UnitsInStock меньше или равным 10. Это выполняется точно так же, как и FormView, как и в DetailsView. Начните с создания обработчика событий для события DataBound FormView.

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

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

В обработчике событий приведите свойство DataItem FormView к экземпляру 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. Форматирование элемента управления метки Унитсинстокклабел в 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";
        }
    }
}

Note

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

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

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

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

единицы складского номера отображаются красным цветом для продуктов со значениями 10 или меньше

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

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

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

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

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

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

  • RowCreated срабатывает после создания GridViewRow
  • RowDataBound срабатывает после привязки текущей записи к GridViewRow.

Для GridView привязка данных более точно описывается следующей последовательностью действий:

  1. Вызывается событие DataBinding GridView.

  2. Данные привязаны к GridView.

    Для каждой записи в источнике данных

    1. Создание объекта GridViewRow
    2. Запустить событие RowCreated
    3. Привязка записи к GridViewRow
    4. Запустить событие RowDataBound
    5. Добавление GridViewRow в коллекцию Rows
  3. Вызывается событие DataBound GridView.

Чтобы настроить формат отдельных записей 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. Свойству DataItem GridViewRowприсваивается определенный ProductRow, после чего вызывается обработчик событий RowDataBound GridView. Чтобы определить UnitPrice значение для каждого продукта, привязанного к GridView, необходимо создать обработчик событий для события RowDataBound GridView. В этом обработчике событий можно проверить значение UnitPrice для текущего GridViewRow и принять решение о форматировании для этой строки.

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

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

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

Создание обработчика событий таким образом приведет к автоматическому добавлению следующего кода в часть кода страницы 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 строки, привязанной к записи из DataSource GridView
  • EmptyDataRow строку, отображаемую, если DataSource GridView пуста
  • Footer строку нижнего колонтитула; отображается, если свойство ShowFooter GridView имеет значение true
  • Header строку заголовка; отображается, если свойство Шовхеадер элемента GridView имеет значение true (по умолчанию)
  • Pager для элемента GridView, который реализует разбиение на страницы, строка, отображающая интерфейс разбиения на страницы
  • Separator не используется для GridView, но используются свойствами RowType для элементов управления DataList и Repeater, два веб-элемента управления данными будут обсуждаться в следующих учебных курсах.

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

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

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

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

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

Вместо того, чтобы устанавливать свойство BackColor GridViewRowнапрямую, придерживайтесь использования классов 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 каждое свойство DataItem экземпляра GridViewRow содержит данные, привязанные к этой строке, которая доступна в обработчике событий RowDataBound.

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

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

Поздравляем с программированием!

Об авторе

Скотт Митчелл, автор семи книг по ASP/ASP. NET и основатель 4GuysFromRolla.com, работал с веб-технологиями Майкрософт с 1998. Скотт работает как независимый консультант, преподаватель и модуль записи. Его последняя книга — Sams обучать себя ASP.NET 2,0 за 24 часа. Он доступен по адресу mitchell@4GuysFromRolla.com. или через его блог, который можно найти по адресу http://ScottOnWriting.NET.

Специальная благодарность

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