Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从ASP.NET GridView获取数据行_C#_Asp.net_Gridview_Event Handling_Datarow - Fatal编程技术网

C# 从ASP.NET GridView获取数据行

C# 从ASP.NET GridView获取数据行,c#,asp.net,gridview,event-handling,datarow,C#,Asp.net,Gridview,Event Handling,Datarow,我有一个ASP.NETGridView,它绑定到一个ObjectDataSource(它绑定到一个MySQL数据库)。在这个网格中,我有两个未绑定的ButtonField列,我想触发服务器端事件。因此,我向GridView的RowCommand事件添加了一个eventhandler方法 在所述eventhandler的代码中,我需要以某种方式获得用户单击的底层DataRow。然而,我似乎无法让它发挥作用;如果使用如下代码,则selectedRow变量始终为null: protected void

我有一个ASP.NET
GridView
,它绑定到一个
ObjectDataSource
(它绑定到一个MySQL数据库)。在这个网格中,我有两个未绑定的
ButtonField
列,我想触发服务器端事件。因此,我向
GridView
RowCommand
事件添加了一个eventhandler方法

在所述eventhandler的代码中,我需要以某种方式获得用户单击的底层
DataRow
。然而,我似乎无法让它发挥作用;如果使用如下代码,则
selectedRow
变量始终为
null

protected void searchResultsGridView_RowCommand(object sender, GridViewCommandEventArgs e)
{
  CallDataRow selectedRow = (CallDataRow) searchResultsGridView.Rows[Convert.ToInt32(e.CommandArgument)].DataItem;
}
我在谷歌上搜索并找到了类似的页面,但没有找到任何有效的页面。我很确定我只是错过了一些明显的东西,但我不知道是什么

以下是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>

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

  • 添加包含绑定HiddenField的TemplateField

    <asp:TemplateField ShowHeader="False">
      <ItemTemplate>
        <asp:HiddenField ID="audioFileName" runat="server" Value='<%# Eval("AudioFileName") %>' />
      </ItemTemplate>
    </asp:TemplateField>
    

  • 这是一个棍棒,它不是特别安全,但它工作,这就是我现在需要的。任何更好的解决方案都是受欢迎的,尽管…

    我意识到这已经晚了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(使用转换为:):


    我还没来得及参加聚会呢!但当我从谷歌来到这里时,有些人可能仍然会碰到这个问题,因此我将给出我的答案:

    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();
       }
    }
    

    因此,您可以获得codebehind中的任何数据字段。

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

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

    <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();
        }
    
    
    受保护的void gridview_onrow命令(对象发送方,事件参数e)
    {
    字符串selectedPkey=null;
    GridViewCommandEventArgs gridEvent=(GridViewCommandEventArgs)e;
    int index=Convert.ToInt32(gridEvent.CommandArgument);
    如果(索引>=0&&index
    这将为我提供一个RowType==DataRow和DataItem==null的GridViewRow。由于我需要它来获取基础DataRow,而DataItem在本例中为null,因此这不是答案。您是否尝试了没有隐藏字段的其他解决方案?无法在
    void GridResultados_row命令中使用(对象发送方,GridViewCommandEventArgs e)
    event
    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;
    }
    
    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();
       }
    }
    
    <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();
        }