在GridView RowCommand中获取DataKey值

我有一个与关联的DataKey ,这是项目ID的GridView 。 如何在RowCommand事件中检索该值?

这似乎工作,但我不喜欢投给LinkButton (如果其他一些命令发射事件呢?),我对NamingContainer位没有太多的信心。

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

我知道,我可以通过该ID作为CommandArgument ,但我select使用DataKey给我更多的灵活性。

我也知道可以使用隐藏字段的ID,但我认为这是一个我不想使用的黑客。

我通常通过CommandArgument传递RowIndex并使用它来检索我想要的DataKey值。

在button上:

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

在服务器事件上

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

我设法使用此代码获取DataKeys的值:

我在GridView中添加了:

 DataKeyNames="ID" OnRowCommand="myRowCommand" 

然后在我的行命令function:

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

您可以在使用foreach或者OnRowDataBound类的任何GridView事件迭代时使用此代码。

在这里你可以用逗号分隔inputDataKeyNames的多个值。 例如, DataKeyNames="ProductID,ItemID,OrderID"

您现在可以通过提供如下的索引来访问每个DataKeys

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

您也可以使用键名而不是其索引来获取DataKeyNames集合中的值,如下所示:

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

你可以这样做:

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

在button上:

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

在服务器事件上

 e.CommandArgument