Solución:
He aquí una forma muy sencilla:
<asp:ButtonField ButtonType="Button" CommandName="Edit" Text="Edit" Visible="True"
CommandArgument="<%# Container.DataItemIndex %>" />
MSDN dice que:
La clase ButtonField completa automáticamente la propiedad CommandArgument con el valor de índice apropiado. Para otros botones de comando, debe establecer manualmente la propiedad CommandArgument del botón de comando. Por ejemplo, puede establecer CommandArgument en <% # Container.DataItemIndex%> cuando el control GridView no tiene la paginación habilitada.
Por lo tanto, no debería necesitar configurarlo manualmente. Un comando de fila con GridViewCommandEventArgs lo haría accesible; p.ej
protected void Whatever_RowCommand( object sender, GridViewCommandEventArgs e )
{
int rowIndex = Convert.ToInt32( e.CommandArgument );
...
}
Aquí está la sugerencia de Microsoft para esto http://msdn.microsoft.com/en-us/library/bb907626.aspx#Y800
En la vista de cuadrícula, agregue un botón de comando y conviértalo en una plantilla, luego dele un nombre de comando en este caso “Añadir al carrito“y también agregue CommandArgument “<% # ((GridViewRow) Container) .RowIndex%>“
<asp:TemplateField>
<ItemTemplate>
<asp:Button ID="AddButton" runat="server"
CommandName="AddToCart"
CommandArgument="<%# ((GridViewRow) Container).RowIndex %>"
Text="Add to Cart" />
</ItemTemplate>
</asp:TemplateField>
Luego, para crear en el evento RowCommand de la vista de cuadrícula, identifique cuándo se activa el comando “AddToCart” y haga lo que quiera desde allí
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.
}
}
** Un error que estaba cometiendo es que quería agregar las acciones en el botón de mi plantilla en lugar de hacerlo directamente en el evento RowCommand.