miércoles, 3 de febrero de 2010

ASP .Net: ¿Cómo obtener el ID de un GridView que no muestra campo ID.

Éste caso consiste en que se desea obtener el valor del campo llave de una tabla cuando se dispare un evento cualquiera del Grid. De alguna forma se desea obtener el valor de la llave con la condición adicional de que el campo llave no aparece en el Grid ya que éste es invisible o se decidió no ponerlo en el grid.

Dicho caso está relacionada con una entrada anterior titulada: ASP .NET Recuperar ID de fila en gridview.html

La situación aquí es que se creó una columna en el grid pero se olvidó poner a dicha columna el atributo DataField="CODIGO".
Siendo más claros, el código para la columna que se metió en el grid manualmente es el siguiente:
<asp:boundfield headertext="Modificar" datafield="CODIGO">
</headerstyle></asp:boundfield>

Ahora bien, el código anterior lo que hace es que aparezca una columna adicional en el Grid, aunque el DataSource no contenga esa columna.

En el code-behind, auque tratemos de recuperar el valor del campo llave que en éste caso se llama COLUMNA, ¡SERÁ CASO PERDIDO GARANTIZADO!.

Para soluionarlo se debe agregar el atributo DataField a la columna y de esa forma se logrará obtener el valor del campo llave aunque éste no esté en el GridView.

Ejemplo:
<asp:boundfield headertext="Modificar" DataField="CODIGO">
</headerstyle></asp:boundfield>
Para terminar el ejemplo, ¿Cómo hacer que una celda del grid haga algo cuando le demos clic a un link dentro de la celda o a un control cualquiera dentro de la celda?

La solución más rápida es utilizar el evento RowDataBound y dentro de éste poner
un código equivalente al siguiente:
If e.Row.RowType = DataControlRowType.DataRow Then
e.Row.Cells(0).Text = "<a href=" +
Page.ClientScript.GetPostBackClientHyperlink(Me.GridView1, "Modificar$" +
e.Row.Cells(1).Text, False) + ">" + "[Modificar Fila]" + "</a>"
End If

El código anterior utiliza el método GetPostBackClientHyperlink del objeto ClientScript para insertar código Javascript del lado del cliente. La ventaja de hacerlo así, es que éste genera una llamada a la función __doPostBack que también está del lado del cliente provocando una llamada al evento o eventos del objeto GridView (los eventos en el lado del servidor del GridView).

Ahora bien, una vez creado completamente el gridview en pantalla, en caso de que el usuario haga clic sobre el link que está en la celda de la fila, éste disparará al evento RowCommand del GridView. En el evento RowCommand se puede preguntar por los parámetros CommandName y CommandArgument para obtener los valores tanto del tipo de operación que se realiza o preguntar por el valor adicional que se pasa en CommandArgument.

1 comentario:

Anónimo dijo...

Il semble que vous soyez un expert dans ce domaine, vos remarques sont tres interessantes, merci.

- Daniel