在 GridView RowCommand 中获取 DataKey 值

Posted

技术标签:

【中文标题】在 GridView RowCommand 中获取 DataKey 值【英文标题】:Get DataKey values in GridView RowCommand 【发布时间】:2011-02-18 13:54:03 【问题描述】:

我有一个 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。

【问题讨论】:

【参考方案1】:

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

在按钮上:

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

关于服务器事件

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

【讨论】:

我最终使用了 CommandArgument,但我可以看到这个解决方案也可以工作。 当我使用链接而不是按钮时,我可以在没有在 aspx 页面中设置 CommandArgument 的情况下使用它。事件 arg 的 CommandArguement 属性包含行的索引。我刚刚使用了服务器事件的代码,它工作了。 Vb代码:Dim rowIndex As Integer = Integer.Parse(e.CommandArgument.ToString()) Dim val As String = Me.grdDatosPadres.DataKeys(rowIndex).Item("Field").ToString 我只想补充一点,您可以像这样获得行索引,而无需将其添加到命令参数“ ((GridViewRow)((LinkBut​​ton)e.CommandSource).Parent.Parent).RowIndex; ”和使用命令参数来存储另一个数据。 作为替代方案,如果您确实更喜欢在 .aspx 中以声明方式指定特定数据项,而不是在代码隐藏中“钓鱼”,您可以指定它像在 .aspx 中这样: CommandArgument='' 并在代码中简单地作为 e.CommandArgument 使用它(注意它是一个对象,你可能需要一个投取决于你想用它做什么)。在某些情况下,您可能会发现这更简单和/或更清晰。【参考方案2】:

我设法使用此代码获取 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;
    
 

【讨论】:

当使用多个数据键时,我建议使用:string ID = myGrid.DataKeys[myRow.RowIndex].Values("ID").ToString()【参考方案3】:
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();

【讨论】:

【参考方案4】:

你可以这样做:

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

【讨论】:

不,这还不够。 CommandArgument的初始值不是行ID,是一个空字符串。【参考方案5】:

在按钮上:

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

关于服务器事件

e.CommandArgument

【讨论】:

以上是关于在 GridView RowCommand 中获取 DataKey 值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 c# ASP.NET 中使用 GridView_RowCommand 事件从 GridView 获取图像

如何在gridview的rowcommand事件中在新选项卡中打开页面?

GridView RowCommand 事件未触发

我们如何对 RowCommand、RowDeleting 等 gridview 事件进行 ajax 调用

GridView获取行数据

gridview控件,怎么点击选中,获取行的数据?