代码改变世界

分析petshop3.0显示产品列表

2006-04-23 19:54  Clingingboy  阅读(545)  评论(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这三个页面中,重复的使用了这个用户控件显示商品