【问题标题】:Get DataKey values in GridView RowCommand在 GridView RowCommand 中获取 DataKey 值
【发布时间】: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。

【问题讨论】:

    标签: asp.net events gridview rowcommand datakey


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-02
        • 1970-01-01
        • 2010-09-18
        • 2011-03-25
        • 2016-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多