【问题标题】:How to enable sorting on a PagedList<T>如何在 PagedList<T> 上启用排序
【发布时间】:2009-11-28 09:52:16
【问题描述】:

我希望有人用过非常优秀的PagedList from Troy Goode?我实际上在 Winforms 应用程序中使用它,虽然它确实有效,但我失去了对其进行排序的能力。

返回一个 PagedList、控制 Page 和 Size 以及绑定到 DataGridView 没有问题,但我最关心的是排序。现在我也遇到了SortedPageList by Muhammad Mosa,但我真的对参数要求之一感到困惑。我正在使用私有方法返回一个 SortedPageList,但我下面的代码似乎不起作用:

private SortedPagedList<Location, Location> GetInactiveLocationData(int Index, int Size) {
    sysDataContext ctx = new sysDataContext();
    try {
        var query = ctx.Location.Where(x => x.Active == false).AsQueryable();
        return query.ToPagedList(Index, Size, i => i, false);          
        //return new SortedPagedList<Location, Location>(query, Index, Size, i => i , true);
    }
    catch (Exception) {
        throw;
    }
}

这会引发错误“Cannot order by type: Location”。显然,我想处理用户单击列标题以对该列进行排序的情况。

我知道解决方案涉及的 Lambda 表达式超出了我所拥有的知识水平(虽然承认很尴尬),但我在这方面完全一无所知!我真的很重视您对上述内容的建议!

谢谢你!

【问题讨论】:

    标签: winforms sorting lambda pagedlist


    【解决方案1】:

    好吧,你可以先学习一些basic LINQ operations(向下滚动到“订购”部分。或者在这里:LINQ Part 1 - Filtering & Sorting Object Lists

    一旦你发现了魔法,你就会飞起来:P

    【讨论】:

    • 嘿好吧。谢谢,但这些是我熟悉的东西。我意识到我问的问题不是很彻底,所以我做了很多编辑。请再看一遍!谢谢!
    【解决方案2】:

    好吧,我觉得自己像个白痴!...嗯,有点!我得到了以下工作:

    using (sysContext ctx = new sysDataContext()) {
        try {
            var data = ctx.Location.Where(x => x.Active == false).AsQueryable();
            var query = data.ToPagedList(PageIndex, PageSize, o => o.DueDate, true);
            dgv.DataSource = query;
        }
        catch (Exception) {
            throw;
        }
    }
    

    现在,排序表达式在这里被描述为o =&gt; o.DueDate。这很棒,虽然这确实有效,但我现在正试图找到一种方法来创建一个允许我使用的通用函数:

    1. 检测单击了哪个列标题(可能使用 switch 语句)
    2. 将其类型转换为适当的 Linq 实体属性
    3. 将该属性传递给泛型方法

    一个类似于以下的方法:

    private void RefreshData([type] SortExpression, bool Ascending, int PageIndex, int PageSize) {
        using (sysDataContext ctx = new sysDataContext()) {
            try {
                var data = ctx.Location.AsQueryable();
                var query = data.ToPagedList(PageIndex, PageSize, o => o.[SortExpression], Ascending);
                dgv.DataSource = query;
            }
            catch (Exception) {
                throw;
            }
        }
    }
    

    这可能吗?

    另外一件事(如果对你有帮助的话)SortedPageList 方法如下所示:

    public static SortedPagedList<T, TResult> ToPagedList<T, TResult>(this IQueryable<T> source, int index, int pageSize, System.Linq.Expressions.Expression<Func<T, TResult>> keySelector, bool asc) {
        return new SortedPagedList<T, TResult>(source, index, pageSize, keySelector, asc);
    }
    

    如何将System.Linq.Expressions.Expression&lt;Func&lt;T, TResult&gt;&gt; 表示为可以作为参数传递的类型?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-23
      • 1970-01-01
      • 2015-02-21
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 2017-02-04
      相关资源
      最近更新 更多