Javascript ASP.NET GridView行选择在第2页及更高版本中不起作用

Javascript ASP.NET GridView行选择在第2页及更高版本中不起作用,javascript,c#,jquery,asp.net,gridview,Javascript,C#,Jquery,Asp.net,Gridview,我使用的gridview包含如下4列,我使用的是页面大小为5的OnSelectedIndexChanged和onpageIndexchange属性 <asp:GridView ID="grid_data" PageSize="5" OnPageIndexChanging="grid_data_PageIndexChanging" OnSelectedIndexChanged="grid_data_SelectedIndexChanged" ShowFooter="true" AllowSo

我使用的gridview包含如下4列,我使用的是页面大小为5的
OnSelectedIndexChanged
onpageIndexchange
属性

<asp:GridView ID="grid_data" PageSize="5" OnPageIndexChanging="grid_data_PageIndexChanging" OnSelectedIndexChanged="grid_data_SelectedIndexChanged" ShowFooter="true" AllowSorting="True" AllowPaging="true" runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField DataField="ID" HeaderText="Data ID" SortExpression="ID" />
        <asp:BoundField DataField="Name" HeaderText="Person Name" SortExpression="Name" />
        <asp:BoundField DataField="Age" HeaderText="Age" SortExpression="Age" />
        <asp:BoundField DataField="Address" HeaderText="Address" SortExpression="Address" />
        <asp:CommandField ShowSelectButton="true" SelectText="View" CausesValidation="false" />
    </Columns>
</asp:GridView>
我从第1列和第2列获取名称和年龄,并将它们存储在会话中,然后打开一个新窗口,在那里我将显示存储在会话中的这些值

最初,我在我的页面上有一个按钮,当我点击该按钮时,查询将被执行并获取数据,并在网格视图中填充,如下所示

protected void button_getdata_Click(object sender, EventArgs e)
{
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["String"].ConnectionString);
    con.Open();
    SqlCommand get = new SqlCommand("select * from PersonTable", con);
    SqlDataAdapter data = new SqlDataAdapter(get);
    DataTable dataTable = new DataTable();
    data.Fill(dataTable);
    ViewState["DATA"] = dataTable;
    grid_data.DataSource = dataTable;
    grid_data.DataBind();
    con.Close();
}
然后,通过将数据表存储在视图状态,我还完成了如下页面处理

protected void grid_data_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    grid_data.PageIndex = e.NewPageIndex;
    grid_data.DataSource = ViewState["DATA"];
    grid_data.DataBind();
}
现在,当我从gridview的第一页单击查看时,在获取数据后,我可以看到带有所需值的新窗口。但是,当我转到下一页时,由于页面处理的原因,页面正在完全加载,但是在除第一页之外的任何其他页面中,如果我单击
View
,我会得到以下错误

Error: Sys.WebForms.PageRequestManagerServerErrorException: Index was out of range. Must be non-negative and less than the size of the collection.
Error: Sys.WebForms.PageRequestManagerServerErrorException: The GridView 'grid_data' fired event Sorting which wasn't handled.
参数名称:索引

当我尝试联机检查时,我了解到这是因为我们同时使用页面大小和分页,我们必须使用其他方法来标识所选行,而不是使用
grid\u data.Rows[grid\u data.SelectedRow.DataItemIndex].Cells[1].Text.ToString()。但我不知道该怎么做,怎么做。是否有其他方法可以正确访问所有页面中的行?还是我做错了什么

此外,每当我尝试对列进行排序时,都会出现以下错误

Error: Sys.WebForms.PageRequestManagerServerErrorException: Index was out of range. Must be non-negative and less than the size of the collection.
Error: Sys.WebForms.PageRequestManagerServerErrorException: The GridView 'grid_data' fired event Sorting which wasn't handled.
我怎么处理分拣的事情

编辑

我找到了这个排序链接,这真的很有效


关于排序问题:

代码隐藏包含一个用于分页的事件处理程序,但不包含一个用于排序的事件处理程序。因此,将事件处理程序添加到代码隐藏中。然后将其指定为OnSorting处理程序

例:

关于所选项目问题:


我建议通过querystring而不是session将personid传递到details.aspx页面。只需在网格中更改一列以包含指向details.aspx?personid={whatever}的链接。并添加target=''u blank',使其在新窗口中打开。详细信息页面应该从查询字符串中读取personid,从数据库中提取,并显示此人的数据。

但是我应该在C#中的函数中给出什么?我已经有一段时间没有使用webforms gridview了。但我相信您会对数据源进行排序/修改,然后重新绑定网格。好的,我会尝试一下……关于选择行的问题,您知道问题是什么吗?请参阅答案,我补充说:关于所选项目的问题OK,但这个问题在其他情况下也会发生..就像我使用的是一个结合sql数据源的普通gridview,在这里我也无法访问第2页及以上的行..我有两个gridview,参数相同,但一个工作正常,另一个有问题..我仍在检查这个问题
protected void grid_data_Sorting(object sender, GridViewSortingEventArgs e)
{        
    //sort dataset
    grid_data.DataBind();
}