【问题标题】:ASP.NET GridView row selection not working in page 2 and aboveASP.NET GridView 行选择在第 2 页及更高版本中不起作用
【发布时间】:2017-01-04 19:59:18
【问题描述】:

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

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

参数名称:索引

当我尝试在线查看时,我才知道这是因为我们同时使用页面大小和分页,我们必须使用其他方法来识别所选行,而不是使用 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)

【问题讨论】:

    标签: javascript c# jquery asp.net gridview


    【解决方案1】:

    关于排序问题:

    您的代码包含用于分页的事件处理程序,但没有用于排序的事件处理程序。所以在后面的代码中添加一个事件处理程序。然后将其指定为 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,从数据库中提取,并显示该人的数据。

    【讨论】:

    • 但是我应该在 C# 的函数中给出什么?
    • 我已经有一段时间没有使用 webforms gridview 了。但我相信你会对数据源进行排序/修改,然后重新绑定网格。
    • 好吧好吧,我会尝试...对于选择行的问题,你知道问题是什么吗?
    • 看答案,我补充说:关于选中项问题
    • 好的,但这个问题在其他情况下也会发生在我身上。就像我使用普通的 gridview 和 sql 数据源一样,在这里我也无法访问第 2 页及以上的行。我有2个具有相同参数的gridview,但一个工作正常,另一个有问题..我仍在检查问题
    猜你喜欢
    • 1970-01-01
    • 2018-11-23
    • 2013-05-18
    • 1970-01-01
    • 2014-05-07
    • 2018-09-29
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多