ASP.NET GridView行选择在第2页及以上版本中不起作用

时间:2017-01-04 19:59:18

标签: javascript c# jquery asp.net gridview

我使用的gridview包含4列,如下所示,我使用OnSelectedIndexChangedOnPageIndexChanging属性,页面大小为5。

<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>

每当我点击命令字段中的View时,就会打开一个新窗口,我必须只显示该人的姓名和年龄,并且我已经完成了以下代码。

protected void grid_data_SelectedIndexChanged(object sender, EventArgs e)
{
    Session["NAME"] = grid_data.Rows[grid_data.SelectedRow.DataItemIndex].Cells[1].Text.ToString();
    Session["AGE"] = grid_data.Rows[grid_data.SelectedRow.DataItemIndex].Cells[2].Text.ToString();
    ScriptManager.RegisterStartupScript(this, typeof(string), "OPEN_WINDOW", "window.open( 'Details.aspx', null, 'height=768,width=1024,status=yes,toolbar=no,scrollbars=yes,menubar=no,location=no,top=0,left=0,resizable=yes' );", true);
}

我从第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获取数据后,我可以看到具有所需值的新窗口。但是当我转到下一页时,页面处理完全由于页面处理而在第一页以外的任何其他页面中如果我点击View我会收到以下错误。

Error: Sys.WebForms.PageRequestManagerServerErrorException: Index was out of range. Must be non-negative and less than the size of the collection.

参数名称:index

当我尝试在线检查时,我发现这是因为我们一起使用页面大小和分页,我们必须使用其他一些方法来识别所选行而不是使用grid_data.Rows[grid_data.SelectedRow.DataItemIndex].Cells[1].Text.ToString();。但我不知道该怎么做以及如何做到这一点。有没有其他方法可以正确访问所有页面中的行?或者我做错了什么?

每当我尝试对列进行排序时,我都会收到以下错误。

Error: Sys.WebForms.PageRequestManagerServerErrorException: The GridView 'grid_data' fired event Sorting which wasn't handled.

我如何处理排序事项?

修改

我找到了这个用于排序的链接,这确实有效。

GridView.Sorting Event (System.Web.UI.WebControls)

1 个答案:

答案 0 :(得分:0)

关于排序问题:

您的代码后面包含用于分页的事件处理程序,但不包含用于排序的事件处理程序所以在后面的代码中添加一个事件处理程序。然后将其指定为OnSorting处理程序。

例如:

<asp:GridView ID="grid_data" PageSize="5" AllowSorting="True" OnSorting="grid_data_Sorting" OnPageIndexChanging="grid_data_PageIndexChanging" OnSelectedIndexChanged="grid_data_SelectedIndexChanged" ShowFooter="true" AllowPaging="true" runat="server" AutoGenerateColumns="false">

protected void grid_data_Sorting(object sender, GridViewSortingEventArgs e)
{        
    //sort dataset
    grid_data.DataBind();
}

关于所选项目问题:

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