Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом руководстве мы рассмотрим, как добавить пользовательские кнопки как в шаблон, так и в поля элемента управления GridView или DetailsView. В частности, мы создадим интерфейс с использованием FormView, который позволяет пользователю пролистывать список поставщиков.
Введение
Хотя многие сценарии создания отчетов включают доступ только для чтения к данным отчета, часто встречается, что отчеты включают в себя возможность выполнять действия на основании отображаемых данных. Обычно это связано с добавлением веб-элемента управления Button, LinkButton или ImageButton для каждой записи, отображаемой в отчете, который при щелчке вызывает обратный вызов и выполняет код на стороне сервера. Изменение и удаление данных в записи — наиболее распространенный пример. На самом деле, как мы видели, начиная с обзора вставки, обновления и удаления данных , редактирование и удаление настолько распространены, что элементы управления GridView, DetailsView и FormView могут поддерживать такие функции без необходимости написания одной строки кода.
Помимо кнопок "Изменить и удалить", элементы управления GridView, DetailsView и FormView также могут включать кнопки, LinkButtons или ImageButtons, которые при щелчке выполняют определенную пользовательскую логику на стороне сервера. В этом руководстве мы рассмотрим, как добавить пользовательские кнопки как в шаблон, так и в поля элемента управления GridView или DetailsView. В частности, мы создадим интерфейс с FormView, который позволит пользователю перелистывать список поставщиков. Для данного поставщика FormView будет отображать сведения о поставщике вместе с веб-элементом управления Button, который при щелчке помечает все связанные с ними продукты как прекращенные. Кроме того, GridView перечисляет продукты, предоставляемые выбранным поставщиком, и в каждой строке присутствуют кнопки увеличения и уменьшения цены, которые при нажатии увеличивают или уменьшают цену продукта на 10 % (см. рис. 1).
Рис. 1. Элемент FormView и GridView содержат кнопки, выполняющие настраиваемые действия (щелкните, чтобы просмотреть изображение полного размера)
Шаг 1. Добавление веб-страниц с руководством по добавлению кнопки
Прежде чем мы разберём, как добавить пользовательские кнопки, давайте сначала создадим ASP.NET страницы в нашем проекте веб-сайта, которые понадобятся для этого руководства. Сначала добавьте новую папку с именем CustomButtons. Затем добавьте в нее следующие две ASP.NET страницы, чтобы связать каждую страницу с главной страницей Site.master :
Default.aspxCustomButtons.aspx
Рис. 2: Добавьте страницы ASP.NET для учебников, связанных с настраиваемыми кнопками
Как и в других папках, Default.aspx в папке CustomButtons будет перечислять учебники в своем разделе. Помните, что элемент SectionLevelTutorialListing.ascx управления пользователем предоставляет эту функцию. Поэтому добавьте этот пользовательский элемент управления Default.aspx, перетащив его из Обозревателя решений на страницу в представлении конструктора.
Добавьте элемент управления пользователем SectionLevelTutorialListing.ascx в Default.aspx
Рис. 3: Добавьте элемент управления SectionLevelTutorialListing.ascx пользователя в Default.aspx (щелкните, чтобы увидеть изображение в полном размере)
Наконец, добавьте страницы в качестве записей в Web.sitemap файл. В частности, добавьте следующую разметку после разбиения по страницам и сортировки <siteMapNode>:
<siteMapNode
title="Adding Custom Buttons"
description="Samples of Reports that Include Buttons for Performing
Server-Side Actions"
url="~/CustomButtons/Default.aspx">
<siteMapNode
title="Using ButtonFields and Buttons in Templates"
description="Examines how to add custom Buttons, LinkButtons,
or ImageButtons as ButtonFields or within templates."
url="~/CustomButtons/CustomButtons.aspx" />
</siteMapNode>
После обновления Web.sitemap просмотрите веб-сайт инструкций через браузер. Меню слева теперь содержит элементы для редактирования, вставки и удаления учебников.
Рис. 4. Карта сайта теперь включает запись для руководства по пользовательским кнопкам
Шаг 2. Добавление FormView с списком поставщиков
Давайте приступим к работе с этим руководством, добавив FormView, который перечисляет поставщиков. Как описано в разделе "Введение", этот FormView позволит пользователю просматривать страницы поставщиков, отображая продукты, предоставляемые поставщиком в GridView. Кроме того, этот FormView будет включать кнопку, которая при щелчке помечает все продукты поставщика как прекращенные. Прежде чем сосредоточиться на добавлении пользовательской кнопки в FormView, сначала создадим FormView, чтобы отобразить сведения о поставщике.
Начните с открытия CustomButtons.aspx страницы в папке CustomButtons . Добавьте FormView на страницу, перетащив его из панели инструментов в конструктор, и установите его свойство ID на Suppliers. В смарт-теге FormView выберите создать объект ObjectDataSource с именем SuppliersDataSource.
Рис. 5. Создание объекта ObjectDataSource С именем SuppliersDataSource (щелкните, чтобы просмотреть изображение полного размера)
Настройте этот новый объект ObjectDataSource таким образом, чтобы он запрашивал запросы из SuppliersBLL метода класса GetSuppliers() (см. рис. 6). Так как этот FormView не предоставляет интерфейс для обновления сведений о поставщике, выберите параметр (Нет) в раскрывающемся списке на вкладке UPDATE.
Рис. 6. Настройка источника данных для использования SuppliersBLL метода класса GetSuppliers() (щелкните, чтобы просмотреть изображение полного размера)
После настройки источника данных ObjectDataSource, Visual Studio сгенерирует InsertItemTemplate, EditItemTemplate, и ItemTemplate для FormView. Удалите InsertItemTemplate и EditItemTemplate, а ItemTemplate измените так, чтобы оно отображало только название компании и номер телефона поставщика. Наконец, включите поддержку постраничной навигации для FormView, установив флажок Enable Paging с помощью смарт-тега (или изменив свойство AllowPaging на True). После этих изменений декларативная разметка страницы должна выглядеть следующим образом:
<asp:FormView ID="Suppliers" runat="server" DataKeyNames="SupplierID"
DataSourceID="SuppliersDataSource" EnableViewState="False" AllowPaging="True">
<ItemTemplate>
<h3>
<asp:Label ID="CompanyName" runat="server"
Text='<%# Bind("CompanyName") %>' />
</h3>
<b>Phone:</b>
<asp:Label ID="PhoneLabel" runat="server" Text='<%# Bind("Phone") %>' />
</ItemTemplate>
</asp:FormView>
<asp:ObjectDataSource ID="SuppliersDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetSuppliers" TypeName="SuppliersBLL">
</asp:ObjectDataSource>
На рисунке 7 показана страница CustomButtons.aspx при просмотре через браузер.
Рис. 7: Просмотр формы отображает поля CompanyName и Phone из текущего выбранного поставщика (щелкните, чтобы просмотреть изображение в полном размере)
Шаг 3. Добавление GridView, в который перечислены продукты выбранного поставщика
Прежде чем добавить кнопку "Прекратить все продукты" в шаблон FormView, сначала добавим GridView под FormView, который перечисляет продукты, предоставляемые выбранным поставщиком. Для выполнения этого добавьте GridView на страницу, задайте свойству ID значение SuppliersProducts, и добавьте новый элемент ObjectDataSource с именем SuppliersProductsDataSource.
Рис. 8. Создание объекта ObjectDataSource С именем SuppliersProductsDataSource (щелкните, чтобы просмотреть изображение полного размера)
Настройте ObjectDataSource для использования метода GetProductsBySupplierID(supplierID) из класса ProductsBLL (см. рис. 9). Хотя этот GridView позволит изменить цену продукта, он не будет использовать встроенные функции редактирования или удаления функций из GridView. Таким образом, для вкладок UPDATE, INSERT и DELETE объекта ObjectDataSource в раскрывающемся списке можно задать значение (Нет).
Рис. 9. Настройка источника данных для использования ProductsBLL метода класса GetProductsBySupplierID(supplierID) (щелкните, чтобы просмотреть изображение полного размера)
GetProductsBySupplierID(supplierID) Так как метод принимает входной параметр, мастер ObjectDataSource запрашивает у нас источник этого значения параметра. Чтобы передать значение SupplierID из FormView, установите параметр источника в раскрывающемся списке на "Control", а параметр ControlID на Suppliers (идентификатор FormView, созданный на шаге 2).
Рис. 10. Указывает, что supplierID параметр должен поступать из Suppliers элемента управления FormView (щелкните, чтобы просмотреть изображение полного размера)
После завершения работы мастера ObjectDataSource, GridView будет содержать BoundField или CheckBoxField для каждого из полей данных продукта. Давайте сократим это, чтобы показать только поля ProductName и UnitPrice BoundFields совместно с полем Discontinued CheckBoxField; более того, давайте отформатируем поле UnitPrice BoundField таким образом, чтобы его текст был представлен как валюта. Декларативная разметка для вашего GridView и SuppliersProductsDataSource ObjectDataSource выглядит следующим образом:
<asp:GridView ID="SuppliersProducts" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="SuppliersProductsDataSource"
EnableViewState="False" runat="server">
<Columns>
<asp:BoundField DataField="ProductName" HeaderText="Product"
SortExpression="ProductName" />
<asp:BoundField DataField="UnitPrice" HeaderText="Price"
SortExpression="UnitPrice" DataFormatString="{0:C}"
HtmlEncode="False" />
<asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued"
SortExpression="Discontinued" />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="SuppliersProductsDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetProductsBySupplierID" TypeName="ProductsBLL">
<SelectParameters>
<asp:ControlParameter ControlID="Suppliers" Name="supplierID"
PropertyName="SelectedValue" Type="Int32" />
</SelectParameters>
</asp:ObjectDataSource>
На этом этапе в нашем руководстве отображается главный отчет или отчет о деталях, позволяющий пользователю выбрать поставщика из FormView вверху и просмотреть продукты, предоставляемые этим поставщиком, через GridView внизу. На рисунке 11 показан снимок экрана этой страницы при выборе поставщика Tokyo Traders из FormView.
Рис. 11. Выбранные продукты поставщика отображаются в GridView (щелкните, чтобы просмотреть изображение полного размера)
Шаг 4. Создание методов DAL и BLL для прекращения всех продуктов для поставщика
Прежде чем добавить кнопку в FormView, которая при щелчке прекращает все продукты поставщика, сначала необходимо добавить метод в DAL и BLL, выполняющих это действие. В частности, этот метод будет называться DiscontinueAllProductsForSupplier(supplierID). Когда нажимается кнопка FormView, мы вызовем этот метод на уровне бизнес-логики, передавая выбранного поставщика, затем BLL вызовет соответствующий метод уровня доступа к данным, который будет выдавать SupplierID команду для базы данных, что прекращает выпуск продуктов указанного поставщикаUPDATE.
Как мы уже сделали в предыдущих руководствах, мы будем использовать подход внизу вверх, начиная с создания метода DAL, а затем метода BLL и, наконец, реализации функциональных возможностей на странице ASP.NET. Откройте типизированный Northwind.xsd набор данных в App_Code/DAL папке и добавьте в нее новый метод ProductsTableAdapter (щелкните правой кнопкой мыши и нажмите кнопку ProductsTableAdapter "Добавить запрос"). При этом откроется мастер настройки запросов TableAdapter, который описывает процесс добавления нового метода. Начните с указания того, что наш метод DAL будет использовать нерегламентированную инструкцию SQL.
Рис. 12. Создание метода DAL с помощью инструкции AD-Hoc SQL (щелкните, чтобы просмотреть изображение полного размера)
Затем мастер предложит нам указать тип создаваемого запроса. Так как метод DiscontinueAllProductsForSupplier(supplierID) должен обновить таблицу базы данных Products, установив поле Discontinued в 1 для всех продуктов, предоставляемых указанным supplierID, необходимо создать запрос, который обновляет данные.
Рис. 13. Выберите тип запроса UPDATE (щелкните, чтобы просмотреть изображение полного размера)
На следующем экране мастера представлен существующий UPDATE оператор TableAdapter, который обновляет каждое из полей, определенных в Products DataTable. Замените этот текст запроса следующей инструкцией:
UPDATE [Products] SET
Discontinued = 1
WHERE SupplierID = @SupplierID
После ввода этого запроса и нажатия кнопки Далее последний экран мастера запрашивает указать имя для DiscontinueAllProductsForSupplier нового метода. Завершите работу мастера, нажав кнопку "Готово". После возвращения в конструктор набора данных вы должны увидеть новый метод в ProductsTableAdapter, названный DiscontinueAllProductsForSupplier(@SupplierID).
Рис. 14. Назовите новый метод DiscontinueAllProductsForSupplier DAL (щелкните, чтобы просмотреть изображение полного размера)
DiscontinueAllProductsForSupplier(supplierID) С помощью метода, созданного на уровне доступа к данным, наша следующая задача — создать DiscontinueAllProductsForSupplier(supplierID) метод на уровне бизнес-логики. Для этого откройте ProductsBLL файл класса и добавьте следующее:
public int DiscontinueAllProductsForSupplier(int supplierID)
{
return Adapter.DiscontinueAllProductsForSupplier(supplierID);
}
Этот метод вызывает метод DiscontinueAllProductsForSupplier(supplierID) в DAL, передавая значение указанного параметра supplierID. Если существуют какие-либо бизнес-правила, которые разрешают отмену продуктов поставщика в определенных обстоятельствах, эти правила должны быть реализованы здесь, в BLL.
Примечание.
UpdateProduct В отличие от перегрузки в ProductsBLL классе, DiscontinueAllProductsForSupplier(supplierID) сигнатура метода не включает DataObjectMethodAttribute атрибут (<System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, Boolean)>). Это исключает DiscontinueAllProductsForSupplier(supplierID) метод из раскрывающегося списка мастера настройки источника данных ObjectDataSource на вкладке UPDATE. Я опустил этот атрибут, так как мы будем вызывать DiscontinueAllProductsForSupplier(supplierID) метод непосредственно из обработчика событий на странице ASP.NET.
Шаг 5. Добавление кнопки "Прекратить все продукты" в FormView
DiscontinueAllProductsForSupplier(supplierID) При выполнении метода в BLL и DAL последний шаг для добавления возможности отмены всех продуктов для выбранного поставщика заключается в добавлении веб-элемента управления Button в FormViewItemTemplate. Добавим кнопку под номером телефона поставщика с текстом кнопки «Прекратить все продукты» и значением свойства IDDiscontinueAllProductsForSupplier. Вы можете добавить этот веб-элемент управления Button через конструктор, щелкнув ссылку "Изменить шаблоны" в смарт-теге FormView (см. рис. 15) или непосредственно с помощью декларативного синтаксиса.
Рис. 15. Добавление веб-элемента управления "Отмена всех продуктов" в элемент управления FormView ItemTemplate (щелкните, чтобы просмотреть изображение полного размера)
Когда кнопка нажимается пользователем на странице, выполняется обратная передача и срабатывает событие FormViewItemCommand событие запускается всякий раз , когда любой элемент управления Button, LinkButton или ImageButton Web управления нажимается в FormView. Это означает, что когда пользователь перемещается с одной страницы на другую в FormView, ItemCommand событие срабатывает; то же происходит и при нажатии пользователей на кнопки "Создать", "Изменить" или "Удалить" в FormView, который поддерживает вставку, обновление или удаление.
ItemCommand Так как событие срабатывает независимо от того, какая кнопка нажата, в обработчике событий нам нужно определить, нажата ли кнопка "Прекратить все продукты" или была нажата другая кнопка. Для этого можно задать для свойства CommandName веб-элемента управления Button идентифицирующее значение. При нажатии кнопки это CommandName значение передается в ItemCommand обработчик событий, что позволяет определить, была ли нажата кнопка "Прекратить все продукты". Задайте для свойства кнопки "Остановить все продукты" CommandName значение "DiscontinueProducts".
Наконец, давайте будем использовать диалоговое окно подтверждения на стороне клиента, чтобы убедиться, что пользователь действительно хочет прекратить продукты выбранного поставщика. Как мы видели в руководстве по добавлению клиентского подтверждения при удалении, это можно сделать с помощью немного кода на JavaScript. В частности, задайте для свойства OnClientClick веб-элемента управления Button значение return confirm('This will mark _all_ of this supplier\'s products as discontinued. Are you certain you want to do this?');
После внесения этих изменений декларативный синтаксис FormView должен выглядеть следующим образом:
<asp:FormView ID="Suppliers" runat="server" DataKeyNames="SupplierID"
DataSourceID="SuppliersDataSource" EnableViewState="False"
AllowPaging="True">
<ItemTemplate>
<h3><asp:Label ID="CompanyName" runat="server"
Text='<%# Bind("CompanyName") %>'></asp:Label></h3>
<b>Phone:</b>
<asp:Label ID="PhoneLabel" runat="server" Text='<%# Bind("Phone") %>' />
<br />
<asp:Button ID="DiscontinueAllProductsForSupplier" runat="server"
CommandName="DiscontinueProducts" Text="Discontinue All Products"
OnClientClick="return confirm('This will mark _all_ of this supplier\'s
products as discontinued. Are you certain you want to do this?');" />
</ItemTemplate>
</asp:FormView>
Затем создайте обработчик событий для события FormView ItemCommand . В этом обработчике событий сначала необходимо определить, была ли нажата кнопка Прекращение всех продуктов. Если это так, мы хотим создать экземпляр класса ProductsBLL и вызвать его метод DiscontinueAllProductsForSupplier(supplierID), передавая SupplierID выбранному FormView.
protected void Suppliers_ItemCommand(object sender, FormViewCommandEventArgs e)
{
if (e.CommandName.CompareTo("DiscontinueProducts") == 0)
{
// The "Discontinue All Products" Button was clicked.
// Invoke the ProductsBLL.DiscontinueAllProductsForSupplier(supplierID) method
// First, get the SupplierID selected in the FormView
int supplierID = (int)Suppliers.SelectedValue;
// Next, create an instance of the ProductsBLL class
ProductsBLL productInfo = new ProductsBLL();
// Finally, invoke the DiscontinueAllProductsForSupplier(supplierID) method
productInfo.DiscontinueAllProductsForSupplier(supplierID);
}
}
Обратите внимание, что SelectedValue возвращает первое значение ключа данных для записи, отображаемой в FormView. СвойствоDataKeyNames, указывающее поля данных, из которых извлекаются значения ключа данных, автоматически задается SupplierID Visual Studio при привязке ObjectDataSource к FormView обратно на шаге 2.
После создания обработчика событий ItemCommand, уделите немного времени, чтобы проверить страницу. Перейдите к поставщику Cooperativa de Quesos 'Las Cabras' (это пятый поставщик в FormView для меня). Этот поставщик предоставляет два продукта, Queso Cabrales и Queso Manchego La Pastora, оба из которых не прекращены .
Представьте себе, что кооператив de Quesos 'Las Cabras' прекратил свою деятельность, и выпуск его продукции будет прекращен. Нажмите кнопку "Прекратить все продукты". Откроется диалоговое окно подтверждения на стороне клиента (см. рис. 16).
Рис. 16: Cooperativa de Quesos Las Cabras поставляет два активных продукта (щелкните, чтобы открыть изображение в полном размере)
Если нажать "ОК" в диалоговом окне подтверждения на стороне клиента, отправка формы продолжится, что приведет к повторной отправке, и событие FormView ItemCommand запустится. Созданный обработчик событий будет выполняться, вызывая метод DiscontinueAllProductsForSupplier(supplierID) и прекращая выпуск продуктов Queso Cabrales и Queso Manchego La Pastora.
Если вы отключили состояние представления GridView, оно будет повторно связываться с базовым хранилищем данных при каждом обратном отклике, и поэтому будет немедленно обновлено, чтобы отразить, что эти два продукта теперь сняты с производства (см. рис. 17). Если, однако, состояние представления в GridView не отключено, необходимо будет вручную повторно привязать данные к GridView после внесения этого изменения. Для этого просто вызовите метод GridView DataBind() сразу после вызова DiscontinueAllProductsForSupplier(supplierID) метода.
Рис. 17. После нажатия кнопки "Прекратить все продукты" продукты поставщика обновляются соответствующим образом (щелкните, чтобы просмотреть изображение полного размера)
Шаг 6. Создание перегрузки UpdateProduct на уровне бизнес-логики для корректировки цены продукта
Как и кнопка "Прекратить все продукты" в FormView, чтобы добавить кнопки для увеличения и уменьшения цены на продукт в GridView, необходимо сначала добавить соответствующие методы уровня доступа к данным и уровня бизнес-логики. Так как у нас уже есть метод, который обновляет одну строку продукта в DAL, мы можем предоставить такие функции, создав новую перегрузку для UpdateProduct метода в BLL.
Наши прошлые UpdateProduct перегрузки использовали какую-то комбинацию полей продукта в виде скалярных входных значений и затем обновляли только эти поля указанного продукта. Для этой перегрузки мы немного отклоняемся от этого стандарта и вместо этого передаем продукт ProductID и процент, на который нужно настроить UnitPrice (в отличие от передачи уже скорректированного UnitPrice). Этот подход упростит код, который необходимо написать в классе кода ASP.NET страницы, так как нам не нужно беспокоиться с определением текущего продукта UnitPrice.
Перегрузка UpdateProduct для этого руководства показана ниже.
public bool UpdateProduct(decimal unitPriceAdjustmentPercentage, int productID)
{
Northwind.ProductsDataTable products = Adapter.GetProductByProductID(productID);
if (products.Count == 0)
// no matching record found, return false
return false;
Northwind.ProductsRow product = products[0];
// Adjust the UnitPrice by the specified percentage (if it's not NULL)
if (!product.IsUnitPriceNull())
product.UnitPrice *= unitPriceAdjustmentPercentage;
// Update the product record
int rowsAffected = Adapter.Update(product);
// Return true if precisely one row was updated, otherwise false
return rowsAffected == 1;
}
Эта перегрузка получает сведения об указанном продукте с помощью метода DAL GetProductByProductID(productID) . Затем он проверяет, присвоено ли значению базы данных NULL значение продукта UnitPrice. Если это так, цена остается неизменной. Если, однако, имеетсяNULLUnitPrice значение, метод обновляет UnitPrice продукта на указанный процент (unitPriceAdjustmentPercent).
Шаг 7. Добавление кнопок увеличения и уменьшения в GridView
GridView (и DetailsView) состоят из коллекции полей. Помимо BoundFields, CheckBoxFields и TemplateFields, ASP.NET включает ButtonField, который, как его имя подразумевает, отображается в виде столбца с кнопкой, LinkButton или ImageButton для каждой строки. Как и в случае с FormView, нажатие любой из кнопок навигации по страницам GridView, кнопок "Изменить" или "Удалить", кнопок сортировки и т. д. приводит к обратной передаче данных и вызывает событие RowCommand.
ButtonField имеет CommandName свойство, присваивающее указанное значение каждому из его свойств Buttons CommandName. Как и в FormView, CommandName значение используется RowCommand обработчиком событий для определения нажатия кнопки.
Давайте добавим два новых ButtonFields в GridView, один с текстом кнопки Цена +10% и другой с текстом Цена -10%. Чтобы добавить эти ButtonFields, щелкните ссылку "Изменить столбцы" из смарт-тега GridView, выберите тип поля ButtonField в списке в левом верхнем углу и нажмите кнопку "Добавить".
Рис. 18. Добавление двух buttonFields в GridView
Переместите два ButtonFields, чтобы они отображались в качестве первых двух полей GridView. Затем присвойте этим двум ButtonFields значения Price +10% и Price -10%, а CommandName свойства — "УвеличитьЦены" и "УменьшитьЦены" соответственно. По умолчанию ButtonField отображает свой столбец кнопок как LinkButtons. Это можно изменить, однако с помощью свойства ButtonFieldButtonType. Давайте отрисуем эти два ButtonFields как обычные кнопки, поэтому установите для свойства ButtonType значение Button. На рисунке 19 показано диалоговое окно "Поля" после внесения этих изменений; далее представлена декларативная разметка GridView.
Рис. 19. Настройка ButtonFields Text, CommandNameи ButtonType свойств
<asp:GridView ID="SuppliersProducts" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="SuppliersProductsDataSource"
EnableViewState="False">
<Columns>
<asp:ButtonField ButtonType="Button" CommandName="IncreasePrice"
Text="Price +10%" />
<asp:ButtonField ButtonType="Button" CommandName="DecreasePrice"
Text="Price -10%" />
<asp:BoundField DataField="ProductName" HeaderText="Product"
SortExpression="ProductName" />
<asp:BoundField DataField="UnitPrice" HeaderText="Price"
SortExpression="UnitPrice" DataFormatString="{0:C}"
HtmlEncode="False" />
<asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued"
SortExpression="Discontinued" />
</Columns>
</asp:GridView>
Создав эти ButtonFields, последний шаг — создать обработчик событий для события GridView RowCommand . Этот обработчик событий, если был вызван из-за того, что были нажаты кнопки Price +10% или Price -10%, должен определить строку ProductID, чья кнопка была нажата, а затем вызвать метод UpdateProduct класса ProductsBLL, передав соответствующую процентную корректировку UnitPrice вместе с ProductID. Следующий код выполняет следующие задачи:
protected void SuppliersProducts_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName.CompareTo("IncreasePrice") == 0 ||
e.CommandName.CompareTo("DecreasePrice") == 0)
{
// The Increase Price or Decrease Price Button has been clicked
// Determine the ID of the product whose price was adjusted
int productID =
(int)SuppliersProducts.DataKeys[Convert.ToInt32(e.CommandArgument)].Value;
// Determine how much to adjust the price
decimal percentageAdjust;
if (e.CommandName.CompareTo("IncreasePrice") == 0)
percentageAdjust = 1.1M;
else
percentageAdjust = 0.9M;
// Adjust the price
ProductsBLL productInfo = new ProductsBLL();
productInfo.UpdateProduct(percentageAdjust, productID);
}
}
Чтобы определить ProductID для строки, в которой была нажата кнопка "Цена +10%" или "Цена -10%", необходимо обратиться к коллекции DataKeys GridView. Эта коллекция содержит значения полей, указанных в свойстве DataKeyNames для каждой строки GridView. Так как для свойства GridView DataKeyNames было установлено значение ProductID Visual Studio при привязке ObjectDataSource к GridView, DataKeys(rowIndex).Value предоставляет ProductID для указанного индекса строки rowIndex.
ButtonField автоматически передает строкуIndex строки, кнопка которой была нажата через e.CommandArgument параметр. Таким образом, чтобы определить ProductID для строки, на кнопке "Цена +10%" или "Цена -10%" которой была нажата, мы используем: Convert.ToInt32(SuppliersProducts.DataKeys(Convert.ToInt32(e.CommandArgument)).Value).
Как и в случае с кнопкой "Прекратить все продукты", если вы отключили состояние представления GridView, GridView возвращается к базовому хранилищу данных на каждой обратной отправке и, следовательно, будет немедленно обновлено, чтобы отразить изменение цены, которое происходит при нажатии любой из кнопок. Если, однако, состояние представления в GridView не отключено, необходимо будет вручную повторно привязать данные к GridView после внесения этого изменения. Для этого просто вызовите метод GridView DataBind() сразу после вызова UpdateProduct метода.
На рисунке 20 показана страница с продуктами, которые предоставляет усадьба Бабушки Келли. На рисунке 21 изображены результаты после нажатия кнопки "Цена +10%" дважды для бабушкиного бойзенберри варенья и нажатие кнопки "Цена -10%" один раз для клюквенного соуса Северных лесов.
Рис. 20. GridView включает в себя кнопки "Цена +10%" и "Цена -10%" (щелкните, чтобы просмотреть изображение полного размера)
Рис. 21. Цены на первый и третий продукт были обновлены с помощью кнопок "Цена +10%" и "Цена -10%" (щелкните, чтобы просмотреть изображение полного размера)
Примечание.
GridView (и DetailsView) также могут содержать кнопки, LinkButtons или ImageButtons, добавленные в их TemplateFields. Как и в случае с BoundField, эти кнопки при щелчке по ним вызовут обратную отправку, активируя событие GridView RowCommand. При добавлении кнопок в TemplateField, однако CommandArgument кнопка не устанавливается автоматически в индекс строки, так как при использовании ButtonFields. Если необходимо определить индекс строки кнопки, которая была нажата в RowCommand обработчике событий, необходимо вручную задать свойство Button CommandArgument в его декларативном синтаксисе в TemplateField, используя следующий код:
<asp:Button runat="server" ... CommandArgument='<%# ((GridViewRow) Container).RowIndex %>'.
Итоги
Элементы управления GridView, DetailsView и FormView могут включать кнопки, LinkButtons или ImageButtons. Такие кнопки при нажатии вызывают обратную передачу и поднимают событие ItemCommand в элементах управления FormView и DetailsView, а также RowCommand в GridView. Эти веб-элементы управления данными имеют встроенные функции для обработки общих действий, связанных с командами, таких как удаление или редактирование записей. Однако мы также можем использовать кнопки, которые по нажатию выполняют пользовательский код.
Для этого необходимо создать обработчик событий для ItemCommand события или RowCommand события. В этом обработчике событий сначала проверьте входящее CommandName значение, чтобы определить, какая кнопка была нажата, а затем выполните соответствующее пользовательское действие. В этом руководстве мы узнали, как использовать кнопки и ButtonFields, чтобы прекратить все продукты для указанного поставщика или увеличить или уменьшить цену конкретного продукта на 10 %.
Счастливое программирование!
Об авторе
Скотт Митчелл, автор семи книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с технологиями Microsoft Web с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга