• 分析petshop3.0显示产品列表


           用户空间中定义一个可以分页的SimplePager.cs类,这个类继承Repeater,可以实现产品的重复显示,上下翻页

      1using System;
      2using System.Collections;
      3using System.Collections.Specialized;
      4using System.Text;
      5using System.Text.RegularExpressions;
      6using System.Web.UI;
      7using System.Web.UI.WebControls;
      8
      9namespace PetShop.Web.Controls {
     10    public class SimplePager : Repeater {
     11
     12        //静态变量
     13        protected const string HTML1 = "<table cellpadding=0 cellspacing=0><tr><td colspan=2>";
     14        protected const string HTML2 = "</td></tr><tr class=gridNav><td>";
     15        protected const string HTML3 = "</td><td align=right>";
     16        protected const string HTML4 = "</td></tr></table>";
     17        private static readonly Regex RX = new Regex(@"^&page=\d+", RegexOptions.Compiled);
     18        private const string LINK_PREV = "<a href=?page={0}><img src=Images/buttonPrev.gif alt=Previous border=\"0\"></a>";
     19        private const string LINK_MORE = "<a href=?page={0}><img src=Images/buttonMore.gif alt=More border=\"0\"></a>";
     20        private const string KEY_PAGE = "page";
     21        private const string COMMA = "?";
     22        private const string AMP = "&";
     23
     24        protected string emptyText;
     25        private IList dataSource;
     26        private int pageSize = 10;
     27        private int currentPageIndex;
     28        private int itemCount;
     29        
     30        override public object DataSource {
     31            set {
     32                
     33                try{
     34                    dataSource = (IList)value;
     35                    ItemCount = dataSource.Count;
     36                }
    catch{
     37                    dataSource = null;
     38                    ItemCount = 0;
     39                }

     40            }

     41        }

     42
     43        /// <summary>
     44        /// 一页产品数量
     45        /// </summary>

     46        public int PageSize {
     47            get return pageSize; }
     48            set { pageSize = value; }
     49        }

     50
     51        /// <summary>
     52        /// 总有几页
     53        /// </summary>

     54        protected int PageCount {
     55            get return (ItemCount - 1/ pageSize; }
     56        }

     57
     58        /// <summary>
     59        /// 产品数量
     60        /// </summary>

     61        virtual protected int ItemCount {
     62            get return itemCount; }
     63            set { itemCount = value; }
     64        }

     65
     66        /// <summary>
     67        /// 当前页
     68        /// </summary>

     69        virtual public int CurrentPageIndex {
     70            get return currentPageIndex; }
     71            set { currentPageIndex = value; }
     72        }

     73
     74        public string EmptyText {
     75            set { emptyText = value; }
     76        }

     77
     78        /// <summary>
     79        /// 设置分页
     80        /// </summary>
     81        /// <param name="index"></param>

     82        public void SetPage(int index) {
     83            OnPageIndexChanged(new DataGridPageChangedEventArgs(null, index));
     84        }

     85
     86        override protected void OnLoad(EventArgs e) {
     87            if (Visible) {
     88                string page = Context.Request[KEY_PAGE];
     89                int index = (page != null? int.Parse(page) : 0;
     90                SetPage(index);
     91            }

     92        }

     93
     94
     95        /// <summary>
     96        /// 控制页面重复显示内容重写
     97        /// </summary>
     98        /// <param name="writer"></param>

     99        override protected void Render(HtmlTextWriter writer) {
    100            
    101            //Check there is some data attached
    102            if (ItemCount == 0{
    103                writer.Write(emptyText);
    104                return;
    105            }

    106
    107            //隐藏查询
    108            string query = Context.Request.Url.Query.Replace(COMMA, AMP);
    109            query = RX.Replace(query, string.Empty);
    110
    111            // 写出控件第一行,表头信息
    112            writer.Write(HTML1);
    113            
    114            // 调用继承方法
    115            base.Render(writer);
    116
    117            // 表格关闭标记
    118            writer.Write(HTML2);
    119            
    120            //判断是否需要上一页下一页按钮
    121            //是否需要上一页按钮
    122            if (currentPageIndex > 0)
    123                writer.Write(string.Format(LINK_PREV, (currentPageIndex - 1+ query));
    124
    125            //表格关闭标记
    126            writer.Write(HTML3);
    127
    128            //是否需要下一页按钮
    129            if (currentPageIndex < PageCount)
    130                writer.Write(string.Format(LINK_MORE, (currentPageIndex + 1+ query));
    131
    132            //表格关闭标记
    133            writer.Write(HTML4);
    134        }

    135
    136        override protected void OnDataBinding(EventArgs e) {
    137
    138            //找到我们想要的重复显示信息
    139            int start = CurrentPageIndex * pageSize;
    140            int size = Math.Min(pageSize, ItemCount - start);
    141    
    142            IList page = new ArrayList();
    143
    144            //从数据源中找到它们之间的关系
    145            for (int i = 0; i < size; i++)
    146                page.Add(dataSource[start + i]);
    147            
    148            //得到数据源
    149            base.DataSource = page;            
    150            base.OnDataBinding(e);
    151            
    152        }

    153
    154        public event DataGridPageChangedEventHandler PageIndexChanged;
    155
    156        virtual protected void OnPageIndexChanged(DataGridPageChangedEventArgs e) {
    157            if (PageIndexChanged != null)
    158                PageIndexChanged(this, e);
    159        }

    160    }

    161}


    在Items.aspx,ItemDetails.aspx,Category.aspx这三个页面中,重复的使用了这个用户控件显示商品
  • 相关阅读:
    牛客小白赛23
    三分查找模板和例题
    链式前向星存图模板
    树形dp求解树的重心和例题
    P3915-树的分解-(dfs)
    P2119 魔法阵-(桶排序+前后缀和)
    小阳的贝壳-(差分+线段树+gcd)
    NOJ1370: [蓝桥杯2018初赛]测试次数-(dp)
    begin.lydsy 入门OJ题库:3611-3613:神炎皇、降雷皇、幻魔皇
    1797: [Noi2010]海拔
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/382871.html
Copyright © 2020-2023  润新知