2009-01-21 28 views
5

Tengo una vista Cuadrícula con ImageButtons agregados a una columna mediante un templatefield. Adjunté una función al evento "OnClick".Obtener índice de fila desde un botón ImageButton en un GridView

Una vez en esta función, ¿cómo puedo obtener el índice de la fila que tiene el botón que se ha presionado? Parece que todo lo que tengo son las coordenadas del mouse en la página.

Respuesta

12

En lugar de bucle a través de las filas puede utilizar esta

<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 
} 
+0

Sweet - esto es más eficiente - Lo voy a integrar. – Jeffrey

+0

Cambiando mi respuesta a esto, ya que esto está más cerca de la solución que realmente implementé. Terminé configurando el valor de TabIndex, y lo miré. ¿Cómo se usa "RowIndex"? es ese un atributo personalizado? – Jeffrey

+0

Awesome Answer !!! – Eric

2

La forma más fácil que he encontrado es usar el evento Command sobre el evento Click, y enviar el ID del artículo como el argumento del comando.

También puede recorrer las filas en el GridView y comparar ImageButton en la fila con el argumento sender en su evento Click.

+0

Hago esto todo el tiempo con enlaces GridView. ¡Eso es genial! –

+1

Funciona, pero es absurdo que RowCommand no pueda decirle qué fila activó el comando. –

12

emitir el emisor a un ImageButton después rem NamingContainer del botón de imagen a una fila:

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; 
+0

buena solución .......... funcionó para mí –

+0

Exactamente lo que estaba buscando. – zeencat

3

Estaría de acuerdo con bdukes que la opción más simple es usar CommandArgument. Enlace el número de identificación único de sus datos en esa propiedad, luego maneje el evento _RowCommand.

Por ejemplo:

<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 
2

Esto es muy buen truco. Tengo otro truco también. Puede probarlo ...

protected void userGridview_RowCommand(object sender, GridViewCommandEventArgs e) 
    { 
     if (e.CommandName == "Select") 
     { 
      GridViewRow rowSelect = (GridViewRow)(((Button)e.CommandSource).NamingContainer); 
      int rowindex = rowSelect.RowIndex; 
     } 
    } 

Es un buen método también.

Cuestiones relacionadas