代码之家  ›  专栏  ›  技术社区  ›  Ian Kemp

从ASP.NET网格视图获取数据行

  •  3
  • Ian Kemp  · 技术社区  · 15 年前

    我有一个ASP.NET GridView 那一定是 ObjectDataSource (绑定到MySQL数据库)。在这个网格上,我有2个未绑定的 ButtonField 要触发服务器端事件的列。因此,我向 GRIDVIEW RowCommand 事件。

    在所述事件处理程序的代码中,我需要以某种方式获取底层 DataRow 用户单击了。但是,我似乎无法让它工作;如果我使用如下代码 selectedRow 变量总是 null :

    protected void searchResultsGridView_RowCommand(object sender, GridViewCommandEventArgs e)
    {
      CallDataRow selectedRow = (CallDataRow) searchResultsGridView.Rows[Convert.ToInt32(e.CommandArgument)].DataItem;
    }
    

    我在谷歌上找到了 http://ranafaisal.wordpress.com/2008/03/31/how-to-get-the-current-row-in-gridview-row-command-event 但是我发现什么都没用。我很确定我只是错过了一些明显的东西,但我不知道是什么…

    以下是ASP.NET代码,如果这有帮助:

      <asp:GridView ID="searchResultsGridView" runat="server" AutoGenerateColumns="False" 
        DataKeyNames="PersonNo,CallDate" 
        Width="100%" AllowPaging="True" EnableSortingAndPagingCallbacks="True" 
        onrowcommand="searchResultsGridView_RowCommand" PageSize="20">
        <Columns>
          <asp:BoundField DataField="PersonNo" HeaderText="Account number" ReadOnly="True" 
            SortExpression="PersonNo" />
          <asp:BoundField DataField="AgentNo" HeaderText="Agent number" 
            SortExpression="AgentNo" />
          <asp:BoundField DataField="AgentName" HeaderText="Agent name" 
            SortExpression="AgentName" />
          <asp:BoundField DataField="TelNumber" HeaderText="Telephone number" 
            SortExpression="TelNumber" />
          <asp:BoundField DataField="CallDate" HeaderText="Call date/time" ReadOnly="True" 
            SortExpression="CallDate" />
          <asp:ButtonField CommandName="play" HeaderText="Audio" ShowHeader="True" 
            Text="Play" />
          <asp:ButtonField CommandName="download" Text="Download" />
        </Columns>
      </asp:GridView>
    
    5 回复  |  直到 8 年前
        1
  •  4
  •   Ian Kemp    15 年前

    最后,通过执行以下操作使其工作:

    1. 添加包含绑定hiddenfield的模板字段。

      <asp:TemplateField ShowHeader="False">
        <ItemTemplate>
          <asp:HiddenField ID="audioFileName" runat="server" Value='<%# Eval("AudioFileName") %>' />
        </ItemTemplate>
      </asp:TemplateField>
      
    2. 在rowcommand事件处理程序中添加以下代码:

      protected void searchResultsGridView_RowCommand(object sender, GridViewCommandEventArgs e)
      {
        string audioFile = ((HiddenField) searchResultsGridView.Rows[Convert.ToInt32(e.CommandArgument)].FindControl("audioFileName")).Value;
      }
      

    这是一个小聪明,也不是特别安全,但它能起作用,这就是我现在所需要的。不过,我们仍然欢迎更好的解决方案…

        2
  •  3
  •   RemarkLima    12 年前

    我更晚去参加聚会了!但当我从Google上得到这个答案时,有些人可能仍然会点击这个,所以我会给出我的答案:

    protected void SomeDataGrid_RowDataBound(object sender, GridViewRowEventArgs e)
    {
       if (e.Row.RowType == DataControlRowType.DataRow)
       {
           System.Data.DataRowView dr = (System.Data.DataRowView)e.Row.DataItem;
           string aVar = dr["DataFieldIdLikePlease"].ToString();
       }
    }
    

    这样就可以得到代码隐藏中的任何数据字段。

        3
  •  1
  •   pete    13 年前

    我意识到这晚了2.5年(对不起!之前没有看到它…),但我使用两个静态/共享方法直接转换行。也许这就是你想要做的?

    vb.net版本:

    Public Shared Function GridViewRowToDataRow(ByVal gvr As GridViewRow) As DataRow
        Dim di As Object = Nothing
        Dim drv As DataRowView = Nothing
        Dim dr As DataRow = Nothing
    
        If gvr IsNot Nothing Then
            di = TryCast(gvr.DataItem, System.Object)
            If di IsNot Nothing Then
                drv = TryCast(di, System.Data.DataRowView)
                If drv IsNot Nothing Then
                    dr = TryCast(drv.Row, System.Data.DataRow)
                End If
            End If
        End If
    
        Return dr
    End Function
    
    Public Shared Function GridViewRowEventArgsToDataRow(ByVal e As GridViewRowEventArgs) As DataRow
        Dim gvr As GridViewRow = Nothing
        Dim di As Object = Nothing
        Dim drv As DataRowView = Nothing
        Dim dr As DataRow = Nothing
    
        If e.Row.RowType = DataControlRowType.DataRow Then
            gvr = TryCast(e.Row, System.Web.UI.WebControls.GridViewRow)
            dr = Helpers.GridViewRowToDataRow(gvr)
        End If
    
        Return dr
    End Function
    

    c.net(转换时使用: http://www.developerfusion.com/tools/convert/vb-to-csharp/ ):

    public static DataRow GridViewRowToDataRow(GridViewRow gvr)
    {
        object di = null;
        DataRowView drv = null;
        DataRow dr = null;
    
        if (gvr != null) {
            di = gvr.DataItem as System.Object;
            if (di != null) {
                drv = di as System.Data.DataRowView;
                if (drv != null) {
                    dr = drv.Row as System.Data.DataRow;
                }
            }
        }
    
        return dr;
    }
    
    public static DataRow GridViewRowEventArgsToDataRow(GridViewRowEventArgs e)
    {
        GridViewRow gvr = null;
        object di = null;
        DataRowView drv = null;
        DataRow dr = null;
    
        if (e.Row.RowType == DataControlRowType.DataRow) {
            gvr = e.Row as System.Web.UI.WebControls.GridViewRow;
            dr = Helpers.GridViewRowToDataRow(gvr);
        }
    
        return dr;
    }
    
        4
  •  1
  •   Kiquenet user385990    8 年前
     int index = Convert.ToInt32(e.CommandArgument);
    
     GridViewRow row = searchResultsGridView.Rows[index];
    
        5
  •  0
  •   dancl    8 年前

    要做到这一点,一个干净的方法似乎是在GridView上使用“DataKeyNames”属性。数据源应包含一个列,该列是唯一标识符或主键。然后,可以将GridView上的DataKeyNames属性设置为该属性的名称。

    然后,与所选行对应的该列的值在row command中可用,并可用于确保将该命令应用于唯一标识的对象。

    <asp:GridView ID="gridview" runat="server" ... DataKeyNames="pkey">
    
    
    protected void gridview_OnRowCommand(object sender, EventArgs e)        
    {
        string selectedPkey = null;
        GridViewCommandEventArgs  gridEvent = (GridViewCommandEventArgs)e;
        int index = Convert.ToInt32(gridEvent.CommandArgument);
        if (index >= 0 && index < gridview.Rows.Count)
        {
            GridViewRow r = gridview.Rows[index];
            selectedPkey = gridview.DataKeys[index].Value.ToString();
        }