此处介绍的情境是:
(1)使用table布局ListView。
(2)ListView的数据源是List。
(3)排序字段2个(帖子的回复次数和浏览次数),都是int类型。
基本思路:
ListView触发数据源排序,使用数据源(即List)的Sort()方法,重新绑定数据源到ListView。
实现步骤:
(1)可查知,List的Sort()方法带有一个ICompare泛型接口类型的形参。所以,首先构造继承该泛型接口的类型:
-
-
-
- public class PostReplyCountAscCompare : IComparer
- {
- #region IComparer 成员
-
- public int Compare(PostInfo x, PostInfo y)
- {
- return x.ReplyCount.CompareTo(y.ReplyCount);
- }
- #endregion
- }
-
-
-
- public class PostReplyCountDescCompare : IComparer
- {
- #region IComparer 成员
- public int Compare(PostInfo x, PostInfo y) {
- return y.ReplyCount.CompareTo(x.ReplyCount);
- }
- #endregion
- }
-
-
-
- public class PostViewCountAscCompare : IComparer
- {
- #region IComparer 成员
- public int Compare(PostInfo x, PostInfo y)
- {
- return x.ViewCount.CompareTo(y.ViewCount);
- }
- #endregion
- }
-
-
-
- public class PostViewCountDescCompare : IComparer
- {
- #region IComparer 成员
-
- 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
- {
-
-
-
-
-
-
-
- public static void Sort(List collection,T2 comparer) where T2:IComparer
- {
- 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。
-
-
-
-
-
- protected void lvPosts_Sorting(object sender, ListViewSortEventArgs e)
- {
-
- if (string.IsNullOrEmpty(e.SortExpression))
- {
- return;
- }
-
- if (ViewState["posts"] != null)
- {
- posts = ViewState["posts"] as List;
- }
- 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(posts, new PostReplyCountAscCompare());
- ViewState["SortDirection"] = SortDirection.Descending;
- }
- else
- {
- SortHelper.Sort(posts, new PostReplyCountDescCompare());
- ViewState["SortDirection"] = SortDirection.Ascending;
- }
- }
- else if (e.SortExpression == "ViewCount")
- {
- if (e.SortDirection == SortDirection.Ascending)
- {
- SortHelper.Sort(posts, new PostViewCountAscCompare());
- ViewState["SortDirection"] = SortDirection.Descending;
- }
- else
- {
- SortHelper.Sort(posts, new PostViewCountDescCompare());
- ViewState["SortDirection"] = SortDirection.Ascending;
- }
- }
- BindPosts(true);
- }
注意:上述方法中的数据源的获取和BindPosts()方法,读者可自行杜撰。
(5)运行界面如下图:
原文地址:
阅读(1034) | 评论(0) | 转发(0) |