Get GridView RowIndex upon button click
Scenario:
There might be case when you want to get the row-index or any other details from the row, when a button inside a GridView Row is clicked. I will show you different ways.
1: "Select" link/button Click
It is very easy when to get row information when you click auto-generated "Select" link/button in GridView row. When this link/button is clicked, gridview raises "Select" event. GridView exposes SelectedRow property which represents the currently selected row and SelectedIndex property which gives the rowindex of the currently selected Row.
When you click the "Select" link/button, you might sometimes want to run custom code using RowIndex. You can do that easily by handling OnSelectedIndexChanged event and do your manipulation.
Now suppose it is not a "Select" button i.e. a button whose CommandName is not 'Select'. In that case you can use any of the following options.
2: Passing RowIndex as CommandArgument of the Button
a) Define you but inside a TemplateField.
b) Set it's CommandName property to some meaningful value
c) Set the CommandArgument of the button as shown in code below.
d) Then use OnRowCommand event to access the row as show in code below:
e.g. here is a sample TemplateField that has a button and the corresponding OnRowCommand event handler
<asp:TemplateField>
<ItemTemplate>
<asp:Button ID="Button1" CommandName="MyButtonClick" CommandArgument='<%# Container.DataItemIndex %>' runat="server" Text="MyButton" />
<asp:Button ID="Button2" runat="server" Text="Button" />
</ItemTemplate>
</asp:TemplateField>
protected void GridView1_RowCommand(object sender, System.Web.UI.WebControls.GridViewCommandEventArgs e)
{
if (e.CommandName == "MyButtonClick")
{
//Get rowindex
int rowindex = Convert.ToInt32(e.CommandArgument);
//Get Row
GridViewRow gvr = GridView1.Rows[rowindex];
}
}
Point to note: CommandArgument='<%# Container.DataItemIndex %>'. Container.DataItemIndex gives the index of current item.
3: Use Button Click Event
<asp:TemplateField>
<ItemTemplate>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="MyButtonClick" />
</ItemTemplate>
</asp:TemplateField> protected void MyButtonClick(object sender, System.EventArgs e)
{
//Get the button that raised the event
Button btn = (Button)sender;
//Get the row that contains this button
GridViewRow gvr = (GridViewRow)btn.NamingContainer;
//Get rowindex
int rowindex = gvr.RowIndex;
}
Point to note:
The last method works with other controls like DropDownList, CheckBoxList, etc inside of gridview. e.g. In case of dropdownlist you will use the OnSelectedIndexChanged event like shown below:
protected void DropDownList1_SelectedIndexChanged(object sender, System.EventArgs e)
{
//Get the dropdownlist that raised the event
DropDownList ddl = (DropDownList)sender;
//Get the row that contains this dropdown
GridViewRow gvr = (GridViewRow)ddl .NamingContainer;
//Get rowindex
int rowindex = gvr.RowIndex;
}
Hope this helps.