【问题标题】:The data source does not support server-side data paging when sorting数据源在排序时不支持服务端数据分页
【发布时间】:2013-08-06 21:32:18
【问题描述】:

我正在尝试使我的 gridview 可排序。我已经允许排序并添加了下面给出的 onsorting 属性

<asp:GridView ID="GWCase" runat="server"  DataKeyNames="detail, propertydetail,suspectdetail " BackColor="#CCCCCC" BorderColor="#999999" BorderStyle="Solid" BorderWidth="3px" CellPadding="4" CellSpacing="2" ForeColor="Black" Width="100%" AutoGenerateSelectButton="True" OnSelectedIndexChanged="GWCase_SelectedIndexChanged" AutoGenerateColumns="False" AllowPaging="True" PageSize="5" OnPageIndexChanging="GWCase_PageIndexChanging" AllowSorting="True" OnSorting="gridView_Sorting" CurrentSortField="memberreportid" CurrentSortDirection="ASC">
    <FooterStyle BackColor="#CCCCCC" />
    <HeaderStyle BackColor="Black" Font-Bold="True" ForeColor="White" />
    <PagerStyle BackColor="#CCCCCC" ForeColor="Black" HorizontalAlign="Left" />
    <RowStyle BackColor="White" />
    <SelectedRowStyle BackColor="#000099" Font-Bold="True" ForeColor="White" />
    <SortedAscendingCellStyle BackColor="#F1F1F1" />
    <SortedAscendingHeaderStyle BackColor="#808080" />
    <SortedDescendingCellStyle BackColor="#CAC9C9" />
    <SortedDescendingHeaderStyle BackColor="#383838" />

<Columns>
     <asp:BoundField DataField="memberreportid" HeaderText="MemberReportID" SortExpression="memberreportid"/>
     <asp:BoundField DataField="typeofcrime" HeaderText="Type of Crime" SortExpression="typeofcrime" />
     <asp:BoundField DataField="crdatetime" HeaderText="ReportDateTime" SortExpression="crdatetime" />
     <asp:BoundField DataField="address" HeaderText="Address" SortExpression="address" />
     <asp:BoundField DataField="incidentdate" HeaderText="Incident Date" SortExpression="incidentdate" />
     <asp:BoundField DataField="incidenttime" HeaderText="Incident Time" SortExpression="incidenttime"/>
     <asp:BoundField DataField="property" HeaderText="Property" SortExpression="Property"/>
     <asp:BoundField DataField="victim" HeaderText="Victim" SortExpression="victim" />
     <asp:BoundField DataField="suspect" HeaderText="Suspect" SortExpression="suspect"/>
     <asp:BoundField DataField="detail" HeaderText="Detail" SortExpression="detail" Visible="false"/>
</Columns>
</asp:GridView>

这是我用来启用排序的 c# 代码

protected void gridView_Sorting(object sender, GridViewSortEventArgs e)
    {
        SortDirection sortDirection = SortDirection.Ascending;
        string sortField = string.Empty;

        SortGridview((GridView)sender, e, out sortDirection, out sortField);

        string strSortDirection = e.SortDirection == SortDirection.Ascending ? "ASC" : "DESC";
        //Error happens here
        GWCase.DataSource = (e.SortExpression + " " + strSortDirection);
        GWCase.DataBind();
    }


    private void SortGridview(GridView gridView, GridViewSortEventArgs e, out SortDirection sortDirection, out string sortField)
    {
        sortField = e.SortExpression;
        sortDirection = e.SortDirection;

        if (gridView.Attributes["CurrentSortField"] != null && gridView.Attributes["CurrentSortDirection"] != null)
        {
            if (sortField == gridView.Attributes["CurrentSortField"])
            {
                if (gridView.Attributes["CurrentSortDirection"] == "ASC")
                {
                    sortDirection = SortDirection.Descending;
                }
                else
                {
                    sortDirection = SortDirection.Ascending;
                }
            }

            gridView.Attributes["CurrentSortField"] = sortField;
            gridView.Attributes["CurrentSortDirection"] = (sortDirection == SortDirection.Ascending ? "ASC" : "DESC");
        }
    } 

我遵循的教程需要一个我没有使用的数据层,因为我已将我的 gridview 与 boundfield 绑定。但是,当尝试获取我的数据源时,他们给了我上述错误。

这就是我绑定网格视图的方式

private void LoadGrid()
    {
        SqlConnection conn = new SqlConnection();
        conn.ConnectionString = "Data Source = localhost; Initial Catalog = MajorProject; Integrated Security= SSPI";
        conn.Open();

        DataSet ds = new DataSet();

        SqlDataAdapter da = new SqlDataAdapter("SELECT memberreportid, typeofcrime, crdatetime, address, detail, incidentdate, incidenttime, property, victim, suspect, detail, suspectdetail, propertydetail from memberreport where assignto = 'unassign'", conn);
        da.Fill(ds);

        GWCase.DataSource = ds.Copy();
        GWCase.DataBind();

        conn.Close();
    }

【问题讨论】:

  • 请将您的代码发布到您最初绑定GridView的位置。

标签: c# asp.net sorting gridview


【解决方案1】:

您的问题是以下代码行:

GWCase.DataSource = (e.SortExpression + " " + strSortDirection);

这告诉GridView 绑定到的数据源类型与您最初将网格绑定到的数据源类型不同。例如,如果用户选择了通过点击Victim列进行排序,那么上面的代码会尝试将victim ascending的字符串设置为数据源,这显然是不正确的。

要在GridView 中获得快速分页/排序功能,最简单的方法是使用DataTable 数据结构以及DataView 数据结构。

之前的 StackOverflow 问题详细介绍了执行此操作的示例。问题本身详细说明了DataTableDataView的使用方便排序和分页,以及使用ViewState维护排序方向是升序还是降序。

阅读Enable Sorting and Paging in Gridview Efficiently 以查看代码示例。

为了更恰当地处理分页/排序,您需要合并自定义分页和排序,而不是 GridView 上的 AllowPaging=TrueAllowSorting=True 设置。这样做的原因是那些GridView 设置仍然要求从您使用的任何数据源(通常是数据库)中获取所有行并将其全部加载到内存中,如果它是 20 行还不错,但是想象一下 10,000 行数据;这将是缓慢且低效的内存使用。真正的分页只会获得要在页面上显示的确切行数,然后在用户导航时要求另一个页面块;多次调用数据库更麻烦,但它在内存方面非常快速和高效。

【讨论】:

  • OP 应该给你一个 +1 的努力伙伴!它节省了我的时间,尤其是当您提到“这样做的原因是那些 GridView 设置仍然要求您使用任何数据源(通常是数据库)的所有行并将其全部加载到内存中,”
  • @Fernando68 很高兴它帮助了你
猜你喜欢
  • 2010-12-12
  • 2012-03-12
  • 2014-08-20
  • 2012-03-31
  • 1970-01-01
  • 2018-09-12
  • 2010-11-19
相关资源
最近更新 更多