web-dev-qa-db-fra.com

Obtenir les valeurs DataKey dans GridView RowCommand

J'ai un GridView avec un DataKey associé, qui est l'ID de l'article. Comment puis-je récupérer cette valeur dans l'événement RowCommand?

Cela semble fonctionner, mais je n'aime pas le transtypage sur LinkButton (que se passe-t-il si une autre commande déclenche l'événement?) Et je ne suis pas trop confiant pour le bit NamingContainer.

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

Je suis conscient que je pourrais plutôt transmettre cet ID sous le nom de CommandArgument, mais j'ai choisi d'utiliser DataKey pour me donner plus de flexibilité.

Je suis également conscient qu'il est possible d'utiliser un champ caché pour l'ID, mais je considère que c'est un hack que je ne veux pas utiliser.

50
Farinha

Je passe habituellement le RowIndex via CommandArgument et l'utilise pour récupérer la valeur DataKey que je veux.

Sur le bouton:

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

Sur l'événement du serveur

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

J'ai réussi à obtenir la valeur des DataKeys en utilisant ce code:

Dans le GridView, j'ai ajouté:

DataKeyNames="ID" OnRowCommand="myRowCommand"

Puis dans ma fonction de commande de ligne:

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;
    }
 }
30
Michiel
foreach (GridViewRow gvr in gvMyGridView.Rows)
{
    string PrimaryKey = gvMyGridView.DataKeys[gvr.RowIndex].Values[0].ToString();
}

Vous pouvez utiliser ce code lors d'une itération avec foreach ou pour tout événement GridView tel que OnRowDataBound.

Ici, vous pouvez entrer plusieurs valeurs pour DataKeyNames en les séparant par une virgule ,. Par exemple, DataKeyNames="ProductID,ItemID,OrderID".

Vous pouvez maintenant accéder à chacun de DataKeys en fournissant son index comme ci-dessous:

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

Vous pouvez également utiliser le nom de clé au lieu de son index pour obtenir les valeurs de la collection DataKeyNames comme ci-dessous:

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();
10
Zulqarnain Jalil

vous pouvez simplement faire ceci:

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

Sur le bouton:

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

Sur l'événement du serveur

e.CommandArgument
2
Vincenzo Costa