Как вы можете получить доступ и отобразить индекс строки элемента gridview в качестве аргумента команды в кнопке столбца поля кнопки?
<gridview>
<Columns>
<asp:ButtonField ButtonType = "Button"
CommandName = "Edit" Text = "Edit" Visible = "True"
CommandArgument = " ? ? ? " />
.....





Обычно я связываю эти данные с помощью события RowDatabound с GridView:
protected void FormatGridView(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
((Button)e.Row.Cells(0).FindControl("btnSpecial")).CommandArgument = e.Row.RowIndex.ToString();
}
}
Думаю, это сработает.
<gridview>
<Columns>
<asp:ButtonField ButtonType = "Button" CommandName = "Edit" Text = "Edit" Visible = "True" CommandArgument = "<%# Container.DataItemIndex %>" />
</Columns>
</gridview>
это с одинарной кавычкой: CommandArgument = '<% # Container.DataItemIndex%>'
@balexandre, одинарные кавычки необязательны, если внутри тегов ASP.NET нет двойных кавычек.
void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
Button b = (Button)e.CommandSource;
b.CommandArgument = ((GridViewRow)sender).RowIndex.ToString();
}
Вот очень простой способ:
<asp:ButtonField ButtonType = "Button" CommandName = "Edit" Text = "Edit" Visible = "True"
CommandArgument='<%# Container.DataItemIndex %>' />
Для GridView это DataItemIndex, а НЕ ItemIndex. ItemIndex предназначен для ретранслятора
Я получил сообщение об ошибке «System.Web.UI.WebControls.ButtonField не имеет события DataBinding». когда я пытался. Но для CommandArgument автоматически устанавливается значение rowindex (см. Ответ Rich).
но он показывает, что индекс ошибки вышел за пределы допустимого диапазона. Должен быть неотрицательным и быть меньше размера коллекции. Имя параметра: индекс в System.Collections.ArrayList.get_Item (индекс Int32) в System.Web.UI.WebControls.GridViewRowCollection.get_Item (индекс Int 32) в Philip.Modules.ItemMapping.ViewItemMapping.gvItem_RowCommandEventAr (объект-отправитель) д)
Когда gridview разрешает разбиение на страницы, это решение не работает. См. Ответ Мохамеда Ахмеда Абдель-Хафеза, Container.DisplayIndex работает точно так же, как значение ButtonField.CommandArgument.
MSDN говорит, что:
The ButtonField class automatically populates the CommandArgument property with the appropriate index value. For other command buttons, you must manually set the CommandArgument property of the command button. For example, you can set the CommandArgument to <%# Container.DataItemIndex %> when the GridView control has no paging enabled.
Таким образом, вам не нужно устанавливать его вручную. После этого команда строки с GridViewCommandEventArgs сделает ее доступной; например
protected void Whatever_RowCommand( object sender, GridViewCommandEventArgs e )
{
int rowIndex = Convert.ToInt32( e.CommandArgument );
...
}
Ага. Это 5 часов моей жизни, которые я потерял только потому, что не прочитал этот пост сначала.
Вот предложение Microsoft для этого http://msdn.microsoft.com/en-us/library/bb907626.aspx#Y800
В gridview добавьте командную кнопку и преобразуйте ее в шаблон, затем дайте ей имя команды в данном случае «Добавить в корзину», а также добавьте CommandArgument "<% # ((GridViewRow) Контейнер) .RowIndex%>"
<asp:TemplateField>
<ItemTemplate>
<asp:Button ID = "AddButton" runat = "server"
CommandName = "AddToCart"
CommandArgument = "<%# ((GridViewRow) Container).RowIndex %>"
Text = "Add to Cart" />
</ItemTemplate>
</asp:TemplateField>
Затем для создания в событии RowCommand окна gridview определите, когда запускается команда «AddToCart», и сделайте оттуда все, что захотите.
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "AddToCart")
{
// Retrieve the row index stored in the
// CommandArgument property.
int index = Convert.ToInt32(e.CommandArgument);
// Retrieve the row that contains the button
// from the Rows collection.
GridViewRow row = GridView1.Rows[index];
// Add code here to add the item to the shopping cart.
}
}
** Одна ошибка, которую я сделал, заключалась в том, что я хотел добавить действия на кнопку моего шаблона вместо того, чтобы делать это непосредственно в событии RowCommand.
<asp:TemplateField HeaderText = "" ItemStyle-Width = "20%" HeaderStyle-HorizontalAlign = "Center">
<ItemTemplate>
<asp:LinkButton runat = "server" ID = "lnkAdd" Text = "Add" CommandName = "Add" CommandArgument='<%# Eval("EmpID"))%>' />
</ItemTemplate>
</asp:TemplateField>
Это традиционный способ и последняя версия фреймворка asp.net со строго типизированными данными, и вам не нужно использовать их в виде строки, такой как «EMPID».
<asp:LinkButton ID = "LnkBtn" runat = "server" Text = "Text" RowIndex='<%# Container.DisplayIndex %>' CommandArgument='<%# Eval("??") %>' OnClick = "LnkBtn_Click" />
внутри вашего обработчика событий:
Protected Sub LnkBtn_Click(ByVal sender As Object, ByVal e As EventArgs)
dim rowIndex as integer = sender.Attributes("RowIndex")
'Here you can use also the command argument for any other value.
End Sub
Я не знаю, почему голосование против, Container.DataItemIndex не работает, когда gridview разрешает разбиение на страницы. Это решение работало нормально (точно так же, как значение ButtonField.CommandArgument). +1
с пейджингом вам нужно сделать некоторые вычисления
int index = Convert.ToInt32(e.CommandArgument) % GridView1.PageSize;
Попробуй по этой ссылке get-gridview-rowindex-при нажатии кнопки