从ASP.NET GridView获取DataRow

Ian*_*emp 3 c# asp.net gridview datarow event-handling

我有一个GridView绑定到ObjectDataSource(绑定到MySQL数据库)的ASP.NET 。在此网格上,我有2个未绑定的ButtonField列要触发服务器端事件。因此,我已经添加的事件处理程序的方法的GridViewRowCommand事件。

在上述事件处理程序的代码中,我需要以某种方式掌握DataRow用户单击的基础。但是,我似乎无法使它起作用。如果我使用如下代码,则selectedRow变量始终为null

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

我已经在Google上搜索并找到了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>
Run Code Online (Sandbox Code Playgroud)

Ian*_*emp 5

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

  1. 添加一个包含绑定的HiddenField的TemplateField。

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

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

这是一个杂物,并不是特别安全,但是它可以工作,这就是我现在所需要的。尽管如此,仍然欢迎任何更好的解决方案...