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.
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"];
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;
}
}
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();
vous pouvez simplement faire ceci:
string id = GridName.DataKeys[Convert.ToInt32(e.CommandArgument)].Value.ToString();
Sur le bouton:
CommandArgument='<%# Eval("myKey")%>'
Sur l'événement du serveur
e.CommandArgument