2010-05-12 12 views
48

Ho un GridView con un valore associato DataKey, che è l'ID oggetto. Come posso recuperare quel valore all'interno dell'evento RowCommand?Ottieni i valori DataKey in GridView RowCommand

Questo sembra funzionare, ma non mi piace il cast per LinkButton (e se qualche altro comando sta sparando l'evento?), E non sono troppo sicuro del bit NamingContainer.

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

Mi rendo conto che avrei potuto invece passare che ID come il CommandArgument, ma ho scelto di usare DataKey per darmi una maggiore flessibilità.

Sono anche consapevole che è possibile utilizzare un campo nascosto per l'ID, ma ritengo che un hack che non voglio usare.

risposta

84

Di solito passo il RowIndex via CommandArgument e lo uso per recuperare il valore DataKey che voglio.

sul pulsante:

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

sull'evento Server

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

Ho finito per usare CommandArgument, ma posso vedere come funzionerebbe anche questa soluzione. – Farinha

+1

Penso che sia meglio quando hai bisogno di accedere più di un solo valore ... – Elph

+0

Quando ho usato un collegamento piuttosto che un pulsante, ho fatto in modo che funzionasse senza impostare CommandArgument nella pagina aspx. La proprietà CommandArguement dell'argomento evento conteneva l'indice della riga. Ho appena usato il codice per l'evento del server e ha funzionato. – grahamesd

26

sono riuscito ad ottenere il valore delle DataKeys utilizzando questo codice:

Nel GridView ho aggiunto:

DataKeyNames="ID" OnRowCommand="myRowCommand" 

Poi nella mia funzione di comando di fila:

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

quando si utilizzano più tasti di dati, suggerisco di utilizzare: string ID = myGrid.DataKeys [myRow.RowIndex] .Values ​​("ID"). ToString() – Shide

5

si può semplicemente fare questo:

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

No, non è sufficiente. Il valore iniziale di 'CommandArgument' non è l'ID di riga, è una stringa vuota. – modiX

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

È possibile utilizzare questo codice mentre si fa un'iterazione con foreach o per qualsiasi evento GridView come OnRowDataBound.

Qui è possibile immettere più valori per DataKeyNames separando con la virgola ,. Ad esempio, DataKeyNames="ProductID,ItemID,OrderID".

È possibile ora accedere a ciascuno dei DataKeys, fornendo il suo indice come di seguito:

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(); 

È inoltre possibile utilizzare Nome chiave al posto del suo indice per ottenere i valori da DataKeyNames collezione come di seguito:

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

sul pulsante:

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

sul server, anche t

e.CommandArgument 
Problemi correlati