在ListView中实现排序

在ListView中实现排序此处介绍的情境是:(1)使用table布局ListView。(2)ListView的数据源是List。(3)排序字段2个(帖子的回复次数和浏览次数),都是int类型。基本思路:ListView触发数据

大家好,又见面了,我是你们的朋友全栈君。

此处介绍的情境是:

(1)使用table布局ListView。

(2)ListView的数据源是List<T>。

(3)排序字段2个(帖子的回复次数和浏览次数),都是int类型。

 

基本思路:

ListView触发数据源排序,使用数据源(即List<T>)的Sort()方法,又一次绑定数据源到ListView。

 

实现步骤:

(1)可查知,List<T>的Sort()方法带有一个ICompare<T>泛型接口类型的形參。所以,首先构造继承该泛型接口的类型:

    /// <summary>
    /// 回复升序比較类
    /// </summary>
    public class PostReplyCountAscCompare : IComparer<PostInfo>
    {
        #region IComparer<PostInfo> 成员

        public int Compare(PostInfo x, PostInfo y)
        {
            return x.ReplyCount.CompareTo(y.ReplyCount);
        }

        #endregion
    }
    /// <summary>
    /// 回复降序比較类
    /// </summary>
    public class PostReplyCountDescCompare : IComparer<PostInfo>
    {
        #region IComparer<PostInfo> 成员

        public int Compare(PostInfo x, PostInfo y)
        {
            return y.ReplyCount.CompareTo(x.ReplyCount);
        }

        #endregion
    }


    /// <summary>
    /// 浏览升序比較类
    /// </summary>
    public class PostViewCountAscCompare : IComparer<PostInfo>
    {
        #region IComparer<PostInfo> 成员

        public int Compare(PostInfo x, PostInfo y)
        {
            return x.ViewCount.CompareTo(y.ViewCount);
        }

        #endregion
    }
    /// <summary>
    /// 浏览降序比較类
    /// </summary>
    public class PostViewCountDescCompare : IComparer<PostInfo>
    {
        #region IComparer<PostInfo> 成员

        public int Compare(PostInfo x, PostInfo y)
        {
            return y.ViewCount.CompareTo(x.ViewCount);
        }

        #endregion
    }

注意:上述的PostInfo模型类,读者能够杜撰,但要有ViewCount和ReplyCount属性(int类型)。

(2)因为有4个排序规则,相应上述(1)中的4个类。所以构造一个排序辅助类:SortHelper,代码例如以下:

    

    public class SortHelper
    {
        /// <summary>
        /// 对集合进行排序——泛型方法
        /// </summary>
        /// <typeparam name="T1">集合中的对象类型</typeparam>
        /// <typeparam name="T2">排序类型</typeparam>
        /// <param name="collection">要排序的集合</param>
        /// <param name="comparer">排序器</param>
        public static void Sort<T1,T2>(List<T1> collection,T2 comparer) where T2:IComparer<T1>
        {
            collection.Sort(comparer);
        }
    }

(3)设计ListView,构造排序字段

<LayoutTemplate>
                    <table class="PostList">
                        <tr class="PostListHeader">
                            <td colspan="2">
                                标题
                            </td>
                            <td>
                                公布日期
                            </td>
                            <td>
                                <asp:LinkButton runat="server" ID="lbtnReply" Text="回复" CommandName="Sort" CommandArgument="ReplyCount"
                                    CssClass="sortLink"></asp:LinkButton>
                            </td>
                            <td>
                                <asp:LinkButton runat="server" ID="lbtnView" Text="浏览" CommandName="Sort" CommandArgument="ViewCount"
                                    CssClass="sortLink"></asp:LinkButton>
                            </td>
                            <td>
                                最后发表
                            </td>
                            <td>
                                删除
                            </td>
                        </tr>
                        <tr runat="server" id="itemPlaceholder">
                        </tr>
                    </table>
                    <div class="pager">
                        <asp:DataPager ID="pagerBottom" runat="server" PageSize="5">
                            <Fields>
                                <asp:NextPreviousPagerField ButtonCssClass="command" FirstPageText="<<" PreviousPageText="<"
                                    RenderDisabledButtonsAsLabels="true" ShowFirstPageButton="true" ShowLastPageButton="false"
                                    ShowNextPageButton="false" ShowPreviousPageButton="true" />
                                <asp:NumericPagerField ButtonCount="7" CurrentPageLabelCssClass="current" NextPreviousButtonCssClass="command"
                                    NumericButtonCssClass="command" />
                                <asp:NextPreviousPagerField ButtonCssClass="command" LastPageText=">>" NextPageText=">"
                                    RenderDisabledButtonsAsLabels="true" ShowFirstPageButton="false" ShowLastPageButton="true"
                                    ShowNextPageButton="true" ShowPreviousPageButton="false" />
                            </Fields>
                        </asp:DataPager>
                    </div>
                </LayoutTemplate>

注意:上面LayoutTemplate中的两个LinkButton,用来作为用户排序接口。其CommandName属性为Sort(固定),CommandArgument分别为ReplyCount和ViewCount。

(4)ListView公开了两个与排序相关的事件:Sorting和Sorted。

        /// <summary>
        /// listview排序
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void lvPosts_Sorting(object sender, ListViewSortEventArgs e)
        {
            //推断是否指定了排序字段
            if (string.IsNullOrEmpty(e.SortExpression))
            {
                return;
            }
            //数据源
            if (ViewState["posts"] != null)
            {
                posts = ViewState["posts"] as List<PostInfo>;
            }
            else
            {
                posts = new PostInfoBLL().GetAllPosts(begin, end);
                ViewState["posts"] = posts;
            }
            //升序还是降序
            if (ViewState["SortDirection"] != null)
            {
                  e.SortDirection=(SortDirection)ViewState["SortDirection"];
            }

            //按哪个字段排序
            if (e.SortExpression == "ReplyCount")
            {
                if (e.SortDirection == SortDirection.Ascending)
                {
                    //泛型方法调用
                    SortHelper.Sort<PostInfo, PostReplyCountAscCompare>(posts, new PostReplyCountAscCompare());
                    ViewState["SortDirection"] = SortDirection.Descending;
                }
                else
                {
                    SortHelper.Sort<PostInfo, PostReplyCountDescCompare>(posts, new PostReplyCountDescCompare());
                    ViewState["SortDirection"] = SortDirection.Ascending;
                }
            }
            else if (e.SortExpression == "ViewCount")
            {
                if (e.SortDirection == SortDirection.Ascending)
                {
                    SortHelper.Sort<PostInfo,PostViewCountAscCompare>(posts, new PostViewCountAscCompare());
                    ViewState["SortDirection"] = SortDirection.Descending;
                }
                else
                {
                    SortHelper.Sort<PostInfo,PostViewCountDescCompare>(posts, new PostViewCountDescCompare());
                    ViewState["SortDirection"] = SortDirection.Ascending;
                }
            }
            BindPosts(true);
        }

注意:上述方法中的数据源的获取和BindPosts()方法,读者可自行杜撰。

(5)执行界面例如以下图:

<span role="heading" aria-level="2">在ListView中实现排序

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155506.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月3日 下午7:46
下一篇 2022年7月3日 下午7:46


相关推荐

  • 决策树(分类树、回归树)

    决策树(分类树、回归树)决策树前言 第一篇博客 最近看完决策树 想着归纳一下 也方便自己以后回顾 写的会比较全面一些 可能会有很多不太正确的地方 欢迎大家交流指正 决策树模型 决策树模型是运用于分类以及回归的一种树结构 决策树由节点和有向边组成 一般一棵决策树包含一个根节点 若干内部节点和若干叶节点 决策树的决策过程需要从决策树的根节点开始 待测数据与决策树中的特征节点进行比较 并按照比较结果选

    2026年3月19日
    2
  • 各大公司Java后端开发面试题总结

    各大公司Java后端开发面试题总结ThreadLocal(线程变量副本)Synchronized实现内存共享,ThreadLocal为每个线程维护一个本地变量。采用空间换时间,它用于线程间的数据隔离,为每一个使用该变量的线程提供一个副本,每个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突。ThreadLocal类中维护一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值为对应线程的变量副本。Thre

    2022年5月6日
    40
  • 30 个实例详解 TOP 命令!「建议收藏」

    30 个实例详解 TOP 命令!

    2022年2月13日
    43
  • 添加打印机时错误为0x0000011b_连接打印机0x000003e3

    添加打印机时错误为0x0000011b_连接打印机0x000003e3问题描述前几天共享打印机还可以使用的突然就不能打印了,删除重新安装时就提示windows无法连接到打印机,如下图:解决方案这是的补丁代号为KB5005569/KB5005573/KB5005568/KB5005566/KB5005565造成的。卸掉上述补丁即可解决问题步骤找到设置——>更新和安全—->Windows更新—->“查看更新历史记录—->卸载更新本人的经验分享,希望可以帮助到你们,如何不对的地方,可以评论留言,帮我指正一下,如果帮助了你

    2025年9月3日
    12
  • tracert原理及其实现_tracert第一个地址是什么

    tracert原理及其实现_tracert第一个地址是什么Tracert用于测试数据包从发送主机到目的地所经过的网关,它主要用于检查网络连接是否可达,以及分析网络什么地方发生了故障.Tracert的执行过程是:首先发送一个TTL为1的数据包,因此第一跳发送回一个ICMP错误消息以指明此数据包不能被发送(因为TTL超时)之后此数据包被重新发送,TTL为2,同样第二跳返回TTL超时,这个过程不断进行,直到到达目的地.执行这些过程的目的是记录每一个ICM

    2026年3月11日
    5
  • 重磅升级!文心 ERNIE-5.0 新一代原生全模态大模型,这你都不认可它吗?!

    重磅升级!文心 ERNIE-5.0 新一代原生全模态大模型,这你都不认可它吗?!

    2026年3月12日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号