在 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)((LinkButton)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事件中在新选项卡中打开页面?