GridView.RowCommand Событие
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Происходит при нажатии кнопки в элементе GridView управления.
public:
event System::Web::UI::WebControls::GridViewCommandEventHandler ^ RowCommand;
public event System.Web.UI.WebControls.GridViewCommandEventHandler RowCommand;
member this.RowCommand : System.Web.UI.WebControls.GridViewCommandEventHandler
Public Custom Event RowCommand As GridViewCommandEventHandler
Тип события
Примеры
Проект веб-сайта Visual Studio с исходным кодом доступен для сопровождения этого раздела: скачивание.
В следующем примере показано, как использовать RowCommand событие для добавления имени клиента из GridView элемента управления в элемент управления ListBox при нажатии кнопки "Добавить".
<%@ Page language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
void ContactsGridView_RowCommand(Object sender, GridViewCommandEventArgs e)
{
// If multiple buttons are used in a GridView control, use the
// CommandName property to determine which button was clicked.
if(e.CommandName=="Add")
{
// Convert the row index stored in the CommandArgument
// property to an Integer.
int index = Convert.ToInt32(e.CommandArgument);
// Retrieve the row that contains the button clicked
// by the user from the Rows collection.
GridViewRow row = ContactsGridView.Rows[index];
// Create a new ListItem object for the contact in the row.
ListItem item = new ListItem();
item.Text = Server.HtmlDecode(row.Cells[2].Text) + " " +
Server.HtmlDecode(row.Cells[3].Text);
// If the contact is not already in the ListBox, add the ListItem
// object to the Items collection of the ListBox control.
if (!ContactsListBox.Items.Contains(item))
{
ContactsListBox.Items.Add(item);
}
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>GridView RowCommand Example</title>
</head>
<body>
<form id="form1" runat="server">
<h3>GridView RowCommand Example</h3>
<table width="100%">
<tr>
<td style="width:50%">
<asp:gridview id="ContactsGridView"
datasourceid="ContactsSource"
allowpaging="true"
autogeneratecolumns="false"
onrowcommand="ContactsGridView_RowCommand"
runat="server">
<columns>
<asp:buttonfield buttontype="Link"
commandname="Add"
text="Add"/>
<asp:boundfield datafield="ContactID"
headertext="Contact ID"/>
<asp:boundfield datafield="FirstName"
headertext="First Name"/>
<asp:boundfield datafield="LastName"
headertext="Last Name"/>
</columns>
</asp:gridview>
</td>
<td style="vertical-align:top; width:50%">
Contacts: <br/>
<asp:listbox id="ContactsListBox"
runat="server" Height="200px" Width="200px"/>
</td>
</tr>
</table>
<!-- This example uses Microsoft SQL Server and connects -->
<!-- to the AdventureWorks sample database. Use an ASP.NET -->
<!-- expression to retrieve the connection string value -->
<!-- from the Web.config file. -->
<asp:sqldatasource id="ContactsSource"
selectcommand="Select [ContactID], [FirstName], [LastName] From Person.Contact"
connectionstring="<%$ ConnectionStrings:AdventureWorks_DataConnectionString%>"
runat="server"/>
</form>
</body>
</html>
<%@ Page language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
Sub ContactsGridView_RowCommand(ByVal sender As Object, ByVal e As GridViewCommandEventArgs)
' If multiple buttons are used in a GridView control, use the
' CommandName property to determine which button was clicked.
If e.CommandName = "Add" Then
' Convert the row index stored in the CommandArgument
' property to an Integer.
Dim index As Integer = Convert.ToInt32(e.CommandArgument)
' Retrieve the row that contains the button clicked
' by the user from the Rows collection.
Dim row As GridViewRow = ContactsGridView.Rows(index)
' Create a new ListItem object for the contact in the row.
Dim item As New ListItem()
item.Text = Server.HtmlDecode(row.Cells(2).Text) & " " & _
Server.HtmlDecode(row.Cells(3).Text)
' If the contact is not already in the ListBox, add the ListItem
' object to the Items collection of the ListBox control.
If Not ContactsListBox.Items.Contains(item) Then
ContactsListBox.Items.Add(item)
End If
End If
End Sub
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>GridView RowCommand Example</title>
</head>
<body>
<form id="form1" runat="server">
<h3>GridView RowCommand Example</h3>
<table width="100%">
<tr>
<td style="width:50%">
<asp:gridview id="ContactsGridView"
datasourceid="ContactsSource"
allowpaging="true"
autogeneratecolumns="false"
onrowcommand="ContactsGridView_RowCommand"
runat="server">
<columns>
<asp:buttonfield buttontype="Link"
commandname="Add"
text="Add"/>
<asp:boundfield datafield="ContactID"
headertext="Contact ID"/>
<asp:boundfield datafield="FirstName"
headertext="First Name"/>
<asp:boundfield datafield="LastName"
headertext="Last Name"/>
</columns>
</asp:gridview>
</td>
<td style="vertical-align:top; width:50%">
Contacts: <br/>
<asp:listbox id="ContactsListBox"
runat="server" Height="200px" Width="200px"/>
</td>
</tr>
</table>
<!-- This example uses Microsoft SQL Server and connects -->
<!-- to the AdventureWorks sample database. Use an ASP.NET -->
<!-- expression to retrieve the connection string value -->
<!-- from the Web.config file. -->
<asp:sqldatasource id="ContactsSource"
selectcommand="Select [ContactID], [FirstName], [LastName] From Person.Contact"
connectionstring="<%$ ConnectionStrings:AdventureWorks_DataConnectionString%>"
runat="server"/>
</form>
</body>
</html>
В следующем примере показано, как использовать RowCommand событие для обновления цены продукта при нажатии кнопки строки. В этом примере включена функция разбиения на страницы для GridView элемента управления и задает CommandArgument свойство Button элемента управления соответствующим индексом строк.
<%@ Page language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
void ProductsGridView_RowCommand(Object sender, GridViewCommandEventArgs e)
{
// If multiple buttons are used in a GridView control, use the
// CommandName property to determine which button was clicked.
if(e.CommandName=="Increase")
{
// Convert the row index stored in the CommandArgument
// property to an Integer.
int index = Convert.ToInt32(e.CommandArgument);
// Retrieve the row that contains the button clicked
// by the user from the Rows collection.
GridViewRow row = ProductsGridView.Rows[index];
// Calculate the new price.
Label listPriceTextBox = (Label)row.FindControl("PriceLabel");
listPriceTextBox.Text = (Convert.ToDouble(listPriceTextBox.Text) * 1.05).ToString();
// Update the row.
ProductsGridView.UpdateRow(index, false);
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>GridView RowCommand Example</title>
</head>
<body>
<form id="form1" runat="server">
<h3>GridView RowCommand Example</h3>
<asp:GridView id="ProductsGridView"
DataSourceID="ProductsDataSource"
DataKeyNames="ProductID"
AllowPaging="True"
OnRowCommand="ProductsGridView_RowCommand"
AutoGenerateColumns="False"
runat="server">
<Columns>
<asp:BoundField DataField="Name" HeaderText="Product Name" />
<asp:BoundField DataField="ProductNumber" HeaderText="Product Number" />
<asp:TemplateField HeaderText="Price">
<ItemTemplate>
<asp:Label ID="PriceLabel" runat="server"
Text='<%# Bind("ListPrice") %>'>
</asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<asp:Button runat="server" ID="IncreaseButton"
Text="Increase Price 5%"
CommandName="Increase"
CommandArgument="<%# ((GridViewRow) Container).RowIndex %>" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<!-- This example uses Microsoft SQL Server and connects -->
<!-- to the AdventureWorks sample database. Use an ASP.NET -->
<!-- expression to retrieve the connection string value -->
<!-- from the Web.config file. -->
<asp:SqlDataSource id="ProductsDataSource"
SelectCommand="SELECT [ProductID], [Name], [ProductNumber], [ListPrice]
FROM Production.Product
WHERE ListPrice <> 0"
UpdateCommand="UPDATE Production.Product SET [ListPrice] = @ListPrice
WHERE [ProductID] = @ProductID"
ConnectionString="<%$ ConnectionStrings:AdventureWorks_DataConnectionString %>"
runat="server" />
</form>
</body>
</html>
<%@ Page language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
Sub ProductsGridView_RowCommand(ByVal sender As Object, ByVal e As GridViewCommandEventArgs)
' If multiple buttons are used in a GridView control, use the
' CommandName property to determine which button was clicked.
If e.CommandName = "Increase" Then
' Convert the row index stored in the CommandArgument
' property to an Integer.
Dim index = Convert.ToInt32(e.CommandArgument)
' Retrieve the row that contains the button clicked
' by the user from the Rows collection.
Dim row = ProductsGridView.Rows(index)
' Calculate the new price.
Dim listPriceTextBox = CType(row.FindControl("PriceLabel"), Label)
listPriceTextBox.Text = (Convert.ToDouble(listPriceTextBox.Text) * 1.05).ToString()
' Update the row.
ProductsGridView.UpdateRow(index, False)
End If
End Sub
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>GridView RowCommand Example</title>
</head>
<body>
<form id="form1" runat="server">
<h3>GridView RowCommand Example</h3>
<asp:GridView id="ProductsGridView"
DataSourceID="ProductsDataSource"
DataKeyNames="ProductID"
AllowPaging="True"
OnRowCommand="ProductsGridView_RowCommand"
AutoGenerateColumns="False"
runat="server">
<Columns>
<asp:BoundField DataField="Name" HeaderText="Product Name" />
<asp:BoundField DataField="ProductNumber" HeaderText="Product Number" />
<asp:TemplateField HeaderText="Price">
<ItemTemplate>
<asp:Label ID="PriceLabel" runat="server"
Text='<%# Bind("ListPrice") %>'>
</asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<asp:Button runat="server" ID="IncreaseButton"
Text="Increase Price 5%"
CommandName="Increase"
CommandArgument="<%# CType(Container, GridViewRow).RowIndex %>" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<!-- This example uses Microsoft SQL Server and connects -->
<!-- to the AdventureWorks sample database. Use an ASP.NET -->
<!-- expression to retrieve the connection string value -->
<!-- from the Web.config file. -->
<asp:SqlDataSource id="ProductsDataSource"
SelectCommand="SELECT [ProductID], [Name], [ProductNumber], [ListPrice]
FROM Production.Product
WHERE ListPrice <> 0"
UpdateCommand="UPDATE Production.Product SET [ListPrice] = @ListPrice
WHERE [ProductID] = @ProductID"
ConnectionString="<%$ ConnectionStrings:AdventureWorks_DataConnectionString %>"
runat="server" />
</form>
</body>
</html>
Комментарии
Событие RowCommand возникает при нажатии кнопки в элементе GridView управления. Это позволяет предоставить метод обработки событий, выполняющий настраиваемую подпрограмму при каждом возникновении этого события.
Кнопки в элементе GridView управления также могут вызывать некоторые встроенные функции элемента управления. Чтобы выполнить одну из этих операций, задайте CommandName для свойства кнопки одно из значений в следующей таблице.
Значение CommandName |
Описание |
|---|---|
Cancel |
Отменяет операцию редактирования и возвращает GridView элемент управления в режим только для чтения. Вызывает событие RowCancelingEdit. |
Delete |
Удаляет текущую запись. RowDeleting Вызывает и RowDeleted события. |
Edit |
Помещает текущую запись в режим редактирования. Вызывает событие RowEditing. |
Page |
Выполняет операцию разбиения по страницам.
CommandArgument Задает свойство кнопки "First", "Last", "Next", "Prev" или номер страницы, чтобы указать тип выполняемой операции разбиения на страницы.
PageIndexChanging Вызывает и PageIndexChanged события. |
Select |
Выбирает текущую запись. SelectedIndexChanging Вызывает и SelectedIndexChanged события. |
Sort |
Сортирует GridView элемент управления. Sorting Вызывает и Sorted события. |
Update |
Обновляет текущую запись в источнике данных. RowUpdating Вызывает и RowUpdated события. |
RowCommand Хотя событие возникает при нажатии кнопки, указанной в предыдущей таблице, рекомендуется использовать события, перечисленные в таблице для операции.
GridViewCommandEventArgs Объект передается методу обработки событий, который позволяет определить имя команды и аргумент команды нажатия кнопки.
Замечание
Чтобы определить индекс строки, вызвавшее событие, используйте CommandArgument свойство аргумента события, передаваемого в событие. Класс ButtonField автоматически заполняет CommandArgument свойство соответствующим значением индекса. Для других кнопок команд необходимо вручную задать CommandArgument свойство кнопки команды. Например, можно задать значение<%# Container.DataItemIndex %>, CommandArgument когда элемент GridView управления не включает разбиение по страницам.
Дополнительные сведения об обработке событий см. в разделе "Обработка и создание событий".