52

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

这似乎可行,但我不喜欢强制转换LinkButton(如果其他命令正在触发事件怎么办?),而且我对此NamingContainer位不太自信。

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

我知道我可以改为将该 ID 作为 传递CommandArgument,但我选择使用它DataKey来给我更多的灵活性。

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

4

5 回答 5

93

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

在按钮上:

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

关于服务器事件

int rowIndex = int.Parse(e.CommandArgument.ToString());
string val = (string)this.grid.DataKeys[rowIndex]["myKey"];
于 2010-05-12T12:33:25.313 回答
33

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

在我添加的 GridView 中:

DataKeyNames="ID" OnRowCommand="myRowCommand"

然后在我的行命令函数中:

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;
    }
 }
于 2011-07-12T23:33:00.317 回答
12
foreach (GridViewRow gvr in gvMyGridView.Rows)
{
    string PrimaryKey = gvMyGridView.DataKeys[gvr.RowIndex].Values[0].ToString();
}

您可以在使用foreach或针对任何 GridView 事件(如OnRowDataBound.

DataKeyNames在这里,您可以通过逗号分隔输入多个值,。例如,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();
于 2014-10-14T09:39:21.757 回答
5

你可以这样做:

string id = GridName.DataKeys[Convert.ToInt32(e.CommandArgument)].Value.ToString();
于 2012-08-08T17:15:44.593 回答
3

在按钮上:

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

关于服务器事件

e.CommandArgument
于 2015-07-22T11:33:08.743 回答