在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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • iic通信协议是什么[通俗易懂]

    iic通信协议是什么[通俗易懂] iic通信协议是什么  IIC协议是二线制,信号线包含SDA和SCL,且信号线是双向的,开路结构,需要通过上拉电阻到VCC,具体的电阻值影响的是信号反应速度和驱动能力。  首先,IIC通信与UART,还有SPI统称为串行接口通信,不过它们之间还是有区别的,如UART的负电平逻辑,还有UART通信不需要时钟,只需要特定的波特率即可,SPI与IIC都可以有一个主机,多个从机的情况,…

    2022年6月9日
    47
  • Traceroute原理「建议收藏」

    Traceroute原理「建议收藏」通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径。当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一样,但基本上来说大部分时候所走的路由是相同的。linux系统中,我们称之为traceroute,在MSWindows中为tracert。traceroute通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间。一条路径上的每个设备traceroute要测3次。输出结果中包括每次测试的时间(ms)和

    2022年7月21日
    14
  • vb四环棋的实现,平面四子棋

    vb四环棋的实现,平面四子棋

    2021年3月12日
    232
  • 关闭eslint的两种方法

    关闭eslint的两种方法1.vue.config.js中添加module.exports={lintOnSave:false,}2.package.json中修改”eslintConfig”:{“root”:true,”env”:{“node”:true},”extends”:[“plugin:vue/essential”,”eslint:recommended”…

    2025年6月2日
    0
  • navicat请求码无生成激活码【2021免费激活】「建议收藏」

    (navicat请求码无生成激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~0VOE…

    2022年3月31日
    421
  • 从源码的角度分析mybatis的核心流程(上)

    从源码的角度分析mybatis的核心流程(上)

    2021年8月4日
    55

发表回复

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

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