现在的位置: 首页 > 综合 > 正文

VS2005中分页和多列排序

2013年10月07日 ⁄ 综合 ⁄ 共 6335字 ⁄ 字号 评论关闭
 

      最近在使用ASP.net 2.0GridView 控件时,发现排序与分页功能Microsoft实现的都很简单,比如排序,在点击列名的时候来触发整页的PostBack,然后排序,但是在列头上没有一个显示升序降序的图标,这会让最终用户使用时很迷惑,因为不知道是升序了还是降序了,所以今天首先解决的第一问题就是升序降序在列上显示图标,第二要解决的问题是默认GridView按列排序只能排一列的,也就是不能进行多列排序,而在实际应用中仅仅按照一列来排序是不能满足业务需求的,第三是GridView 分页问题,GridView预定义的分页页码显示,比较简单,而实际应用中,分页可能不是只显示首页,上一页,下一页,末页,或者是数字的页码那么简单,应该更需要,跳转,当前的页码,总页数等,更详尽的信息。

  第一:GridView 多列排序与排序图标显示

  首先我们可以新建一个类库程序,主要需要引用System.Web.Dll文件,然后新建一个类,这个类继承与GridView控件,我们只需要对部分方法进行重新即可。我的演示的例子,采用了单列排序,如果启用多列排序,把控件的AllowMultiColumnSorting设置为True就是多列排序。

1 public class WebGridView:GridView
2
 {
3
 属性#region 属性
4
  /**//// <summary>
5
 /// 是否启用或者禁止多列排序
6
  /// </summary>
7
 [
8
  Description("是否启用多列排序功能"),
9
  Category("排序"),
10
  DefaultValue("false"),
11
 ]
12
 public bool AllowMultiColumnSorting
13
 {
14
  get
15
  {
16
   object o = ViewState["EnableMultiColumnSorting"];
17
   return (o != null ? (bool)o : false);
18
  }
19
  set
20
  {
21
    AllowSorting = true;
22
    ViewState["EnableMultiColumnSorting"] = value;
23
   }
24
   }
25
  /**//// <summary>
26
  /// 升序时显示图标
27
   /// </summary>
28
   [
29
   Description("升序时显示图标"),
30
   Category("排序"),
31
   Editor("System.Web.UI.Design.UrlEditor", typeof(System.Drawing.Design.UITypeEditor)),
32
   DefaultValue(""),
33
34
  ]
35
  public string SortAscImageUrl
36
  {
37
    get
38
    {
39
    object o = ViewState["SortImageAsc"];
40
     return (o != null ? o.ToString() : "");
41
   }
42
   set
43
   {
44
    ViewState["SortImageAsc"] = value;
45
   }
46
  }
47
  /**//// <summary>
48
  /// 降序时显示图标
49
  /// </summary>
50
  [
51
   Description("降序时显示图标"),
52
   Category("排序"),
53
   Editor("System.Web.UI.Design.UrlEditor", typeof(System.Drawing.Design.UITypeEditor)),
54
   DefaultValue(""),
55
  ]
56
  public string SortDescImageUrl
57
  {
58
   get
59
   {
60
    object o = ViewState["SortImageDesc"];
61
      return (o != null ? o.ToString() : "");
62
    }
63
    set
64
   {
65
      ViewState["SortImageDesc"] = value;
66
   }
67
   }
68
   #endregion
69
  重写方法#region 重写方法
70
  protected override void OnSorting(GridViewSortEventArgs e)
71
  {
72
    if (AllowMultiColumnSorting)
73
    {
74
     e.SortExpression = GetSortExpression(e);
75
    }
76
77
    base.OnSorting(e);
78
  }
79
  protected override void OnRowCreated(GridViewRowEventArgs e)
80
  {
81
   if (e.Row.RowType == DataControlRowType.Header)
82
   {
83
     if (SortExpression != String.Empty)
84
    {
85
     DisplaySortOrderImages(SortExpression, e.Row);
86
     this.CreateRow(0, 0, DataControlRowType.EmptyDataRow, DataControlRowState.Normal);
87
    }
88
   }
89
   base.OnRowCreated(e);
90
  }
91
  #endregion
92
  受保护的方法#region 受保护的方法
93
  /**//// <summary>
94
   /// 获取排序表达式
95
   /// </summary>
96
  protected string GetSortExpression(GridViewSortEventArgs e)
97
  {
98
   string[] sortColumns = null;
99
   string sortAttribute = SortExpression;
100
101
   if (sortAttribute != String.Empty)
102
    {
103
    sortColumns = sortAttribute.Split(",".ToCharArray());
104
   }
105
   if (sortAttribute.IndexOf(e.SortExpression) > 0 || sortAttribute.StartsWith(e.SortExpression))
106
   {
107
    sortAttribute = ModifySortExpression(sortColumns, e.SortExpression);
108
   }
109
   else
110
   {
111
    sortAttribute += String.Concat(",", e.SortExpression, " ASC ");
112
   }
113
    return sortAttribute.TrimStart(",".ToCharArray()).TrimEnd(",".ToCharArray());
114
115
   }
116
  /**//// <summary>
117
  /// 修改排序顺序
118
  /// </summary>
119
  protected string ModifySortExpression(string[] sortColumns, string sortExpression)
120
  {
121
   string ascSortExpression = String.Concat(sortExpression, " ASC ");
122
   string descSortExpression = String.Concat(sortExpression, " DESC ");
123
124
   for (int i = 0; i < sortColumns.Length; i++)
125
   {
126
127
    if (ascSortExpression.Equals(sortColumns[i]))
128
    {
129
      sortColumns[i] = descSortExpression;
130
    }
131
132
    else if (descSortExpression.Equals(sortColumns[i]))
133
    {
134
        Array.Clear(sortColumns, i, 1);
135
    }
136
   }
137
138
   return String.Join(",", sortColumns).Replace(",,", ",").TrimStart(",".ToCharArray());
139
140
  }
141
  /**//// <summary>
142
  /// 获取当前的表达式对所选列进行排序
143
   /// </summary>
144
  protected void SearchSortExpression(string[] sortColumns, string sortColumn, out string sortOrder, out int sortOrderNo)
145
  {
146
   sortOrder = "";
147
   sortOrderNo = -1;
148
   for (int i = 0; i < sortColumns.Length; i++)
149
   {
150
     if (sortColumns[i].StartsWith(sortColumn))
151
    {
152
     sortOrderNo = i + 1;
153
     if (AllowMultiColumnSorting)
154
     {
155
      sortOrder = sortColumns[i].Substring(sortColumn.Length).Trim();
156
     }
157
     else
158
     {
159
      sortOrder = ((SortDirection == SortDirection.Ascending) ? "ASC" : "DESC");
160
      }
161
    }
162
   }
163
  }
164
  /**//// <summary>
165
  /// 绘制升序降序的图片
166
  /// </summary>
167
  protected void DisplaySortOrderImages(string sortExpression, GridViewRow dgItem)
168
  {
169
   string[] sortColumns = sortExpression.Split(",".ToCharArray());
170
171
   for (int i = 0; i < dgItem.Cells.Count; i++)
172
   {
173
    if (dgItem.Cells[i].Controls.Count > 0 && dgItem.
Cells[i].Controls[0] is LinkButton)
174
    {
175
     string sortOrder;
176
     int sortOrderNo;
177
     string column = ((LinkButton)dgItem.Cells[i].Controls[0]).CommandArgument;
178
     SearchSortExpression(sortColumns, column, out sortOrder, out sortOrderNo);
179
     if (sortOrderNo > 0)
180
     {
181
      string sortImgLoc = (sortOrder.Equals("ASC") ? SortAscImageUrl : SortDescImageUrl);
182
183
      if (sortImgLoc != String.Empty)
184
      {
185
       Image imgSortDirection = new Image();
186
       imgSortDirection.ImageUrl = sortImgLoc;
187
       dgItem.Cells[i].Controls.Add(imgSortDirection);
188
189
      }
190
      else
191
      {
192
193
       if (AllowMultiColumnSorting)
194
       {
195
         Literal litSortSeq = new Literal();
196
         litSortSeq.Text = sortOrderNo.ToString();
197
         dgItem.Cells[i].Controls.Add(litSortSeq);
198
199
       }
200
       }
201
     }
202
    }
203
   }
204
205
  }
206
   #endregion
207
  }

  第二:详尽的分页信息显示,此功能没有封装成控件形式,直接在GridView_DataBound事件中对尾页操作即可。
下面是多列排序与分页显示代码的演示

<script runat="server">
 void PageDropDownList_SelectedIndexChanged(Object sender, EventArgs e)
 {
   GridViewRow pagerRow = CustomersGridView.BottomPagerRow;
  DropDownList pageList = (DropDownList)pagerRow.Cells[0].FindControl("PageDropDownList");
  CustomersGridView.PageIndex = pageList.SelectedIndex;
  }
  void CustomersGridView_DataBound(Object sender, EventArgs e)
  {
   GridViewRow pagerRow = CustomersGridView.BottomPagerRow;
   LinkButton linkBtnFirst = (LinkButton)pagerRow.Cells[0].FindControl("linkBtnFirst");
   LinkButton linkBtnPrev = (LinkButton)pagerRow.Cells[0].FindControl("linkBtnPrev");
   LinkButton linkBtnNext = (LinkButton)pagerRow.Cells[0].FindControl("linkBtnNext");
   LinkButton linkBtnLast = (LinkButton)pagerRow.Cells[0].FindControl("linkBtnLast");
   if (CustomersGridView.PageIndex == 0)
   {
   

抱歉!评论已关闭.