• 在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)执行界面例如以下图:

  • 相关阅读:
    自定义 ListView
    linux IO重定向
    Facebook开源C++组件库Folly
    在vi按了ctrl+s后
    让Erlang服务器后台运行
    mysql innodb 性能相关参数
    linux 网卡驱动升级
    kernel panic
    32位Linux下使用2G以上大文件的几个相关宏的关系
    CentOS安装erlang
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4292168.html
Copyright © 2020-2023  润新知