У меня есть Gridview с ImageButtons, добавленными в столбец через поле шаблона. Я добавил функцию к событию OnClick.
Попав в эту функцию, как я могу получить индекс строки, в которой была нажата кнопка. Похоже, что все, что у меня есть, это координаты мыши на странице.





Самый простой способ, который я нашел, - использовать событие Командование поверх события Нажмите и отправить идентификатор элемента в качестве аргумента команды.
Вы также можете перебрать строки в GridView и сравнить ImageButton в строке с аргументом sender в событии Click.
Это работает, но абсурдно, что RowCommand не может сказать вам, какая строка запустила команду.
Вместо того, чтобы перебирать строки, вы можете использовать это
<asp:ImageButton runat = "server" id = "ibtn1" ... RowIndex='<%# Container.DisplayIndex %>'
OnClick = "button_click"/>
...
protected void button_click(object sender, EventArgs e){
ImageButton ibtn1 = sender as ImageButton;
int rowIndex = Convert.ToInt32(ibtn1.Attributes["RowIndex"]);
//Use this rowIndex in your code
}
Сладкое - это более эффективно - интегрирую.
Изменяю свой ответ на этот вопрос, так как это ближе к решению, которое я реализовал на самом деле. В итоге я установил значение TabIndex и посмотрел на него. Как вы используете "RowIndex"? это настраиваемый атрибут?
Приведите отправителя к ImageButton, затем приведите NamingContainer кнопки изображения к строке:
VB:
Dim btn as ImageButton = CType(sender, ImageButton)
Dim row as GridViewRow = CType(btn.NamingContainer, GridViewRow)
C#:
ImageButton btn = (ImageButton)sender;
GridViewRow row = (GridViewRow)btn.NamingContainer;
Согласен с bdukes, что самый простой вариант - использовать CommandArgument. Свяжите уникальный идентификационный номер ваших данных с этим свойством, а затем обработайте событие _RowCommand.
Например:
<asp:TemplateField >
<HeaderStyle Width = "20" />
<ItemTemplate>
<asp:ImageButton ImageUrl = "images/icons/iCal.png" CommandArgument='<%# Eval("Event_ID") %>' ToolTip = "iCal" runat = "server" Height = "18" Width = "18" />
</ItemTemplate>
</asp:TemplateField>
Protected Sub gv_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles gv.RowCommand
e.CommandArgument 'use this value in whatever way you like
End Sub
Это очень хороший трюк. У меня есть еще одна хитрость. Можешь попробовать...
protected void userGridview_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Select")
{
GridViewRow rowSelect = (GridViewRow)(((Button)e.CommandSource).NamingContainer);
int rowindex = rowSelect.RowIndex;
}
}
Это тоже хороший метод.
Я все время делаю это с привязками GridView. Это здорово!