[Tips] Multiples DataKeyName en una Grilla (o cuando la tabla tiene una clave compuesta)

Hola que tal?, ya que me han formulado esta pregunta varias veces, quiero dejarla como tips, no es que no me gusta que me pregunten, pero de este modo, la info está accesible más rápidamente.

El gridview que conocemos , es un control que es muy potente, obviamente podemos potenciarlo más y algunas empresas como Telerik tienen su propia implementación mucho más potente. Una de las características más importantes es su facilidad de uso y de configuración en escenarios “Cero Código”  para agregar comportamientos de Eliminacion, Modificación  y selección. Esto es bastante sencillo cuando se tiene que la grilla está mostrando datos de una tabla que tiene una clave principal que no es compuesta, como por ejemplo un ID Correlativo, pero algunas veces, tenemos que la grilla tiene una clave principal compuesta, este escenario es totalmente soportado por nuestra grilla.

Una de las propiedades de la grilla, necesario para poder agregar declarativamente los comportamientos es el DataKeyName, que representa el campo clave de la grilla. Ahora bien, si tenemos una clave compuesta el DataKeyName sería algo así:

DataKeyNames="ID1,ID2"

Hasta el momento todo bien, ahora, si tenemos otro control Gridview, para un maestro detalle, en el que tenemos que la selección de la primera grilla, nos muestra los detalles para la segunda grilla, (voy a utilizar un SqlDataSource), vamos a tener el SelectCommand:

SelectCommand="SELECT IDDET, GLOSA_DET FROM DETALLE WHERE ID1_DET = @ID1 AND ID2_DET=@ID2"

y la los parámetros: (acá está lo distinto, ya que el asistente no nos permite hacer esto, tenemos que hacerlo a mano)

<SelectParameters>
    <asp:ControlParameter ControlID="GridView1" Name="ID1" PropertyName="SelectedDataKey.Values[ID1]" Type="Int32" />
    <asp:ControlParameter ControlID="GridView1" Name="ID2" PropertyName="SelectedDataKey.Values[ID2]"  Type="Int32" />        </SelectParameters>

Como ves, se extrae del SelectDataKey, los dos parámetros para poder hacer el select.

Ahora bien, si lo que necesitas es , por medio de código programático, obtener estos valores entonces tenemos:

Protected Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView1.SelectedIndexChanged

SqlDataSource2.SelectParameters(0).DefaultValue = GridView1.DataKeys(Me.GridView1.SelectedRow.RowIndex).Values(0)

SqlDataSource2.SelectParameters(1).DefaultValue = GridView1.DataKeys(Me.GridView1.SelectedRow.RowIndex).Values(1)

End Sub

En donde SqlDataSource2 es el DS de la grilla detalle, y GridView1 es la grilla con los datos del Maestro.

Como vez, es bastante sencillo, espero que te sirva el Tip 🙂

Saludos,
Gonzalo

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *