在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