Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Настройка формата 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()
метода, происходит следующая последовательность шагов:
- Событие веб-элемента управления
DataBinding
данными запускается. - Данные привязаны к веб-элементу управления данными.
- Событие веб-элемента управления
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>
Проверьте эту страницу в браузере.
Рис. 2. Элемент управления DetailsView отображает один продукт за раз (щелкните, чтобы просмотреть изображение полного размера)
Шаг 2. Программное определение значения данных в обработчике события привязки данных
Чтобы отобразить цену полужирным шрифтом, курсивом для этих продуктов UnitPrice
, стоимость которых превышает $ 75,00, нам необходимо сначала иметь возможность программно определить UnitPrice
значение. Для DetailsView это можно сделать в обработчике DataBound
событий. Чтобы создать обработчик событий, щелкните DetailsView в конструкторе и перейдите в окно "Свойства". Нажмите клавишу F4, чтобы открыть ее, если она не видна, или перейдите в меню "Вид" и выберите пункт меню "Окно свойств". В окне "Свойства" щелкните значок молнии, чтобы получить список событий DetailsView. Затем дважды щелкните событие DataBound
или введите имя обработчика событий, который вы хотите создать.
Рис. 3. Создание обработчика DataBound
событий для события
Это приведет к автоматическому созданию обработчика событий и перенаправит вас в часть кода, в которой она была добавлена. На этом этапе вы увидите следующее:
protected void ExpensiveProductsPriceInBoldItalic_DataBound(object sender, EventArgs e)
{
}
Доступ к данным, привязанным к DetailsView, можно получить через DataItem
свойство. Помните, что мы привязываем наши элементы управления к строго типизированной dataTable, которая состоит из коллекции строго типизированных экземпляров DataRow. При привязке DataTable к DetailsView первая строка DataRow в DataTable назначается свойству DataItem
элемента DetailsView. В частности, DataItem
свойство назначается объекту DataRowView
. Мы можем использовать свойство DataRowView
Row
, чтобы получить доступ к базовому объекту 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
, прежде чем получить доступ к свойству ProductsRow
UnitPrice
. Эта проверка важна, так как если мы пытаемся получить доступ к свойству 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).
Рис. 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
.
Рис. 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. Для продуктов с достаточно большими единицами в складе не применяется настраиваемое форматирование (щелкните, чтобы просмотреть изображение полного размера)
Рис. 8. Количество на складе отображается в красном цвете для продуктов со значением 10 или меньше (Нажмите, чтобы просмотреть изображение полного размера)
Форматирование с помощью события GridViewRowDataBound
Ранее мы изучили последовательность шагов, выполняемых элементами управления DetailsView и FormView во время привязки данных. Давайте рассмотрим эти шаги еще раз для освежения памяти.
- Событие веб-элемента управления
DataBinding
данными запускается. - Данные привязаны к веб-элементу управления данными.
- Событие веб-элемента управления
DataBound
данными запускается.
Эти три простых шага достаточно для DetailsView и FormView, так как они отображают только одну запись. Для GridView, который отображает все записи, привязанные к нему (а не только первую), шаг 2 немного сложнее.
На шаге 2 GridView перечисляет источник данных и для каждой записи создает экземпляр и привязывает текущую GridViewRow
запись к ней. Для каждого GridViewRow
добавленного в GridView создаются два события:
-
RowCreated
срабатывает после созданияGridViewRow
-
RowDataBound
срабатывает после привязки текущей записи кGridViewRow
.
Для GridView привязка данных более точно описана в следующей последовательности шагов:
Срабатывает событие GridView
DataBinding
.Данные привязаны к GridView.
Для каждой записи в источнике данных
-
GridViewRow
Создание объекта - Запустите
RowCreated
событие - Привяжите запись к
GridViewRow
- Запустите
RowDataBound
событие - Добавьте
GridViewRow
в коллекциюRows
-
Срабатывает событие 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 показан наш прогресс до этой точки при просмотре через браузер.
Рис. 9. GridView отображает имя, категорию и цену для каждого продукта (щелкните, чтобы просмотреть изображение полного размера)
Шаг 8. Программное определение значения данных в обработчике событий RowDataBound
При привязке ProductsDataTable
к GridView экземпляры ProductsRow
перечисляются, и для каждого экземпляра ProductsRow
создается GridViewRow
. Свойство GridViewRow
присваивается DataItem
конкретному ProductRow
объекту, после чего вызывается обработчик событий GridView RowDataBound
. Чтобы определить UnitPrice
значение для каждого продукта, привязанного к GridView, необходимо создать обработчик событий для события GridView RowDataBound
. В этом обработчике событий можно проверить UnitPrice
значение текущего GridViewRow
и определить формат для этой строки.
Этот обработчик событий можно создать с помощью той же серии шагов, что и FormView и DetailsView.
Рис. 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
строка, привязанная к записи из GridViewDataSource
-
EmptyDataRow
Строка, отображаемая, если gridViewDataSource
пуста -
Footer
строка нижнего колонтитула; отображается, если для свойства GridViewShowFooter
задано значениеtrue
-
Header
строка заголовка; отображается, если для свойства ShowHeader GridView задано значениеtrue
(по умолчанию) -
Pager
Для GridView'ов, которые реализуют разбиение по страницам, строка, отображающая интерфейс разбиения по страницам -
Separator
не используется для GridView, но используетсяRowType
свойствами для элементов управления DataList и Repeater, два веб-элемента управления данных мы обсудим в будущих руководствах.
Так как строки EmptyDataRow
, Header
, Footer
и Pager
не связаны с записью DataSource
, они всегда будут иметь значение null
для свойства DataItem
. По этой причине, прежде чем пытаться работать с текущим GridViewRow
DataItem
свойством, сначала необходимо убедиться, что мы имеем дело с 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;
Вместо того чтобы напрямую задавать свойство GridViewRow
BackColor
, давайте будем использовать классы 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.