繁体   English   中英

在GridView RowCommand中获取DataKey值

[英]Get DataKey values in GridView RowCommand

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

这似乎可行,但是我不喜欢LinkButtonLinkButton (如果其他命令触发了事件该怎么办?),并且我对NamingContainer位不太自信。

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

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

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

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

在按钮上:

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"

然后在我的行命令功能中:

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进行迭代或对任何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();

您可以这样做:

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

在按钮上:

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

在服务器事件

e.CommandArgument

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM