ASP.Net2.0 GridView 多列排序,显示排序图标,分页

翻译|其它|编辑:郝浩|2008-03-19 10:46:08.000|阅读 1177 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

        最近在使用ASP.net 2.0的GridView 控件时,发现排序与分页功能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)
   {
    linkBtnFirst.Enabled = false;
    linkBtnPrev.Enabled = false;
   }
   else if (CustomersGridView.PageIndex == CustomersGridView.PageCount-1)
   {
    linkBtnLast.Enabled = false;
    linkBtnNext.Enabled = false;
   }
   else if (CustomersGridView.PageCount<=0)
   {
    linkBtnFirst.Enabled = false;
    linkBtnPrev.Enabled = false;
    linkBtnNext.Enabled = false;
    linkBtnLast.Enabled = false;
   }
  DropDownList pageList = (DropDownList)pagerRow.Cells[0].FindControl("PageDropDownList");
  Label pageLabel = (Label)pagerRow.Cells[0].FindControl("CurrentPageLabel");
  if (pageList != null)
  {
   for (int i = 0; i < CustomersGridView.PageCount; i++)
   {
    int pageNumber = i + 1;
    ListItem item = new ListItem(pageNumber.ToString() + "/" + CustomersGridView.PageCount.ToString(), pageNumber.ToString());
    if (i == CustomersGridView.PageIndex)
    {
     item.Selected = true;
    }
    pageList.Items.Add(item);
   }
  }
  if (pageLabel != null)
  {
   int currentPage = CustomersGridView.PageIndex + 1;
   pageLabel.Text = "当前页: " + currentPage.ToString() +
   " / " + CustomersGridView.PageCount.ToString();
  }
  }
</script>
<html>
<body>
<form id="Form1" runat="server">
<h3>
GridView PagerTemplate Example</h3>
<asp:WebGridView ID="CustomersGridView" DataSourceID="CustomersSqlDataSource" AutoGenerateColumns="true"
AllowPaging="true" OnDataBound="CustomersGridView_DataBound" SortAscImageUrl="~\images\arrow-up.gif" SortDescImageUrl="~\images\arrow-down.gif" runat="server" AllowSorting="True" Width="723px">
<PagerStyle ForeColor="Blue" BackColor="LightBlue" />
<PagerTemplate>
<table width="100%">
<tr>
<td width="70%">
<asp:Label ID="MessageLabel" ForeColor="Blue" Text="页码:" runat="server" />
<asp:DropDownList ID="PageDropDownList" AutoPostBack="true" OnSelectedIndexChanged="PageDropDownList_SelectedIndexChanged"
runat="server" />
<asp:LinkButton CommandName="Page" CommandArgument="First" ID="linkBtnFirst" runat="server">首页</asp:LinkButton>
<asp:LinkButton CommandName="Page" CommandArgument="Prev" ID="linkBtnPrev" runat="server">上一页</asp:LinkButton>
<asp:LinkButton CommandName="Page" CommandArgument="Next" ID="linkBtnNext" runat="server">下一页</asp:LinkButton>
<asp:LinkButton CommandName="Page" CommandArgument="Last" ID="linkBtnLast" runat="server">末页</asp:LinkButton>
</td>
<td width="70%" align="right">
<asp:Label ID="CurrentPageLabel" ForeColor="Blue" runat="server" />
</td>
</tr>
</table>
</PagerTemplate>
</asp:WebGridView>
<asp:SqlDataSource ID="CustomersSqlDataSource" SelectCommand="Select [CustomerID], [CompanyName], [Address], [City], [PostalCode], [Country] From [Customers]"
ConnectionString="<%$ ConnectionStrings:NorthWindConnectionString%>" runat="server">
</asp:SqlDataSource>
</form>
</body>
</html>
标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:网络转载

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP