7

背景:

我正在使用 GridView 和 ObjectDataSource。我正在实现分页和排序。

在 ObjectDataSource 上:

        objectDataSource.TypeName = value;
        objectDataSource.SelectMethod = "Select";
        objectDataSource.SelectCountMethod = "SelectCount";
        objectDataSource.SortParameterName = "sortExpression";
        objectDataSource.EnablePaging = true;

在 GridView 上:

        gridView.AllowPaging = true;
        gridView.AllowSorting = true;
        gridView.DataSource = objectDataSource;

为了使分页和排序正常工作,我将“EnableSortingAndPagingCallbacks”设置为 True。之前,我收到“System.Web.HttpException:GridView 触发的事件排序未处理”。这解决了它。

如果我在我的 GridView 中只使用 BoundFields,这很好并且工作正常。

但是,如果我使用 TemplateFields,我会收到“NotSupportedException:TemplateField 不支持回调,因为某些控件无法在回调中正确更新。在 GridView 上关闭回调。”

这是有道理的。我只需要知道如何进行排序,而不使用 EnableSortingAndPagingCallbacks。

如果 EnableSortingAndPagingCallbacks = True:

  • 寻呼工程
  • 分拣作品
  • BoundFields 工作
  • 模板字段不起作用

如果 EnableSortingAndPagingCallbacks = False:

  • 寻呼工程
  • 排序不起作用_
  • BoundFields 工作
  • 模板字段工作

我的问题:

如何让分页、排序和模板字段同时工作?


关于实施的说明:

使用带有 GridView 的 ObjectDataSource 需要实现一个名为 Select 的方法,该方法提供排序表达式、要返回的行数和起始行:

    public IEnumerable<CountyAndStateGridRow> Select(string sortExpression, int maximumRows, int startRowIndex)
    {
        string oql = "select County order by {" + sortExpression + "}" ;

        var counties = QueryProvider.ExecuteQuery(oql).Cast<County>();

        var page = counties.Skip(startRowIndex).Take(maximumRows);

        var rows = page.Select(
            county => new CountyAndStateGridRow
            {
                CountyName = county.Name,
                StateName = county.State.Name,
            });

        return rows;
    }

具体的 SortExpression 在 aspx/ascx 中定义:

<Columns>
       <asp:BoundField HeaderText="County Name" DataField="CountyName" SortExpression="Name" />
       <asp:BoundField HeaderText="State Name" DataField="StateName" SortExpression="State.Name" />
</Columns>

应该在单击列时传入并调用 ObjectDataSource 上的 Select 方法,但如果 EnableSortingAndPagingCallbacks = true 似乎不起作用,而是我得到关于未定义排序事件的异常。

4

3 回答 3

0

属性 EnableSortingAndPagingCallbacks 告诉控件对数据进行客户端排序,以便控件显示为自动排序而无需页面回发。此方法不支持模板字段。为了使用 TemplateFields 并执行排序,您需要连接 GridView.Sorting 事件,并将 AllowSorting 属性设置为 true。完成后,单击列标题时应该触发该事件,并且可以从那里处理排序逻辑。

于 2009-06-17T13:29:01.470 回答
0

将 SortExpression 值更改为 DataField 的值。将 AllowPaging 和 AllowSorting 设置为 true。将 EnableSortingAndPagingCallbacks 设置为 true。

于 2014-07-25T14:16:43.903 回答
0

为了使排序功能起作用:

 <asp:GridView GridView ID="GvCountryDetails" AllowPaging="True" 
OnPageIndexChanging="GvCountryDetails_PageIndexChanging" AllowSorting="True" 
onsorting="GvCountryDetails_Sorting">

在 .cs 文件中,您需要编写

protected void GvCountryDetails_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        GvCountryDetails.PageIndex = e.NewPageIndex;
        isPageIndexChanged = true;
        BindData();
    }

protected void GvCountryDetails_Sorting(object sender, GridViewSortEventArgs e)
    {
        sortExpression = e.SortExpression;
        isPageIndexChanged = false;
        BindData();
    }
    private void SortGridData()
    {
        string sSortdir;
        if (isPageIndexChanged == true)
        {
            sSortdir = ViewState["SortDirection"] as string;
        }
        else
        {
            sSortdir = GetSortDirection(sortExpression);
        }

        string sSortExp = sortExpression;

        if (sSortdir == "ASC")
        {
            lstCountryDetails = Sort<Country>(lstCountryDetails, sSortExp, SortDirection.Ascending);
        }
        else
        {
            lstCountryDetails = Sort<Country>(lstCountryDetails, sSortExp, SortDirection.Descending);
        }
    }

    private List<CountryBO> Sort<TKey>(List<CountryBO> list, string sortBy, SortDirection direction)
    {
        PropertyInfo property = list.GetType().GetGenericArguments()[0].GetProperty(sortBy);
        if (direction == SortDirection.Ascending)
        {
            return list.OrderBy(e => property.GetValue(e, null)).ToList<CountryBO>();
        }
        else
        {
            return list.OrderByDescending(e => property.GetValue(e, null)).ToList<Country>();
        }
    }

    private string GetSortDirection(string column)
    {
        string sortDirection = "ASC";
        string sortExpression = ViewState["SortExpression"] as string;
        if (sortExpression != null)
        {
            if (sortExpression == column)
            {
                string lastDirection = ViewState["SortDirection"] as string;
                if ((lastDirection != null) && (lastDirection == "ASC"))
                {
                    sortDirection = "DESC";
                }
            }
        }

        ViewState["SortDirection"] = sortDirection;
        ViewState["SortExpression"] = column;
        return sortDirection;
    }
于 2014-06-06T09:32:41.273 回答