2010-05-12 55 views
48

Tengo un GridView con un DataKey asociado, que es el ID del artículo. ¿Cómo recupero ese valor dentro del evento RowCommand?Obtener valores de DataKey en GridView RowCommand

Esto parece funcionar, pero no me gusta el molde a LinkButton (¿y si algún otro comando está activando el evento?), Y no estoy muy seguro del bit NamingContainer.

LinkButton lb = (LinkButton)e.CommandSource; 
GridViewRow gvr = (GridViewRow)lb.NamingContainer; 
int id = (int)grid.DataKeys[gvr.RowIndex].Value; 

Soy consciente de que en lugar de eso podía pasar por aquel ID que el CommandArgument, pero optó por utilizar DataKey me dará más flexibilidad.

También soy consciente de que es posible utilizar un campo oculto para la ID, pero considero que es un truco que no quiero usar.

Respuesta

84

Normalmente paso el RowIndex a través de CommandArgument y lo uso para recuperar el valor DataKey que quiero.

en el botón:

CommandArgument='<%# DataBinder.Eval(Container, "RowIndex") %>' 

En el Servidor de eventos

int rowIndex = int.Parse(e.CommandArgument.ToString()); 
string val = (string)this.grid.DataKeys[rowIndex]["myKey"]; 
+0

Terminé usando CommandArgument, pero puedo ver cómo esta solución también funcionaría. – Farinha

+1

Creo que es mejor cuando necesitas acceder a más de un solo valor ... – Elph

+0

Cuando utilicé un enlace en lugar de un botón, hice que esto funcionara sin configurar CommandArgument en la página aspx. La propiedad CommandArguement del evento arg contenía el índice de la fila. Acabo de usar el código para el evento del servidor y funcionó. – grahamesd

26

me las arreglé para obtener el valor de los DataKeys utilizando este código:

En el GridView añadí:

DataKeyNames="ID" OnRowCommand="myRowCommand" 

Luego, en mi fila función de comando:

protected void myRowCommand(object sender, GridViewCommandEventArgs e) 
{ 
    LinkButton lnkBtn = (LinkButton)e.CommandSource; // the button 
    GridViewRow myRow = (GridViewRow)lnkBtn.Parent.Parent; // the row 
    GridView myGrid = (GridView)sender; // the gridview 
    string ID = myGrid.DataKeys[myRow.RowIndex].Value.ToString(); // value of the datakey 

    switch (e.CommandName) 
    { 
     case "cmd1": 
     // do something using the ID 
     break; 
     case "cmd2": 
     // do something else using the ID 
     break; 
    } 
} 
+2

cuando se utilizan varias teclas de datos sugiero usar: string ID = myGrid.DataKeys [myRow.RowIndex] .Values ​​("ID"). ToString() – Shide

5

sólo se puede hacer esto:

string id = GridName.DataKeys[Convert.ToInt32(e.CommandArgument)].Value.ToString(); 
+2

No, eso no es suficiente. El valor inicial de 'CommandArgument' no es el ID de la fila, es una cadena vacía. – modiX

8
foreach (GridViewRow gvr in gvMyGridView.Rows) 
{ 
    string PrimaryKey = gvMyGridView.DataKeys[gvr.RowIndex].Values[0].ToString(); 
} 

Usted puede utilizar este código mientras se hace una iteración con foreach o para cualquier evento GridView como OnRowDataBound.

Aquí puede ingresar valores múltiples para DataKeyNames separándolos con la coma ,. Por ejemplo, DataKeyNames="ProductID,ItemID,OrderID".

Ahora puede acceder a cada una de DataKeys proporcionando su índice, como a continuación:

string ProductID = gvMyGridView.DataKeys[gvr.RowIndex].Values[0].ToString(); 
string ItemID = gvMyGridView.DataKeys[gvr.RowIndex].Values[1].ToString(); 
string OrderID = gvMyGridView.DataKeys[gvr.RowIndex].Values[2].ToString(); 

También puede utilizar Nombre de clave en lugar de su índice para obtener los valores de DataKeyNames colección, como a continuación:

string ProductID = gvMyGridView.DataKeys[gvr.RowIndex].Values["ProductID"].ToString(); 
string ItemID = gvMyGridView.DataKeys[gvr.RowIndex].Values["ItemID"].ToString(); 
string OrderID = gvMyGridView.DataKeys[gvr.RowIndex].Values["OrderID"].ToString(); 
2

en el botón:

CommandArgument='<%# Eval("myKey")%>' 

En el servidor Incluso t

e.CommandArgument 
Cuestiones relacionadas