广

ASP.NET

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

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

    2018-04-13 09:17:55 次阅读 稿源:互联网
    广告

          最近在使用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="~imagesarrow-up.gif" SortDescImageUrl="~imagesarrow-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>

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告