zoukankan      html  css  js  c++  java
  • petshop4学习_重构DataList实现分页

    掌握要点: <IList>,DataGrid翻页事件...
    详细代码如下,慢慢体会..
    using System;
    using System.Collections;
    using System.Collections.Specialized;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Web.UI;
    using System.Web.UI.WebControls;

    namespace CustomControl
    {
        
    /// <summary>
        
    /// CustomList 的摘要说明
        
    /// 重构DataList控件
        
    /// </summary>

        public class CustomList : DataList
        
    {
            
    //静态常量
            protected const string HTML1 = "<table width=100% cellpadding=0 cellspacing=0><tbody><tr><td>";
            
    protected const string HTML2 = "</td></tr><tr><td align=right>";
            
    //protected const string HTML3 = "</td><td align=center class=paging>";

            
    //protected const string HTML5 = "</td><td align=right class=paging>";

            
    protected const string HTML4 = "</td></tr></tbody></table>";

            
    private static readonly Regex RX = new Regex(@"^&page=\d+", RegexOptions.Compiled);
            
    private const string LINK_PREV = "<a href=?page={0}>前一页</a>";
            
    private const string LINK_MORE = "<a href=?page={0}>下一页</a>";
            
    private const string LINK_FIRST = "<a href=?page={0}>首页</a>";     //首页
            private const string LINK_LAST = "<a href=?page={0}>尾页</a>";      //尾页
            private const string KEY_PAGE = "page";
            
    private const string COMMA = "?";
            
    private const string AMP = "&";

            
    protected string emptyText;
            
    private IList dataSource;       //数据源
            private int pageSize = 10;      //每页大小
            private int currentPageIndex;   //当前页
            private int itemCount;          //数据条目总数

            
    /// <summary>
            
    /// 指定要绑定的数据源
            
    /// </summary>

            override public object DataSource
            
    {
                
    set
                
    {
                    
    //This try catch block is to avoid issues with the VS.NET designer
                    
    //The designer will try and bind a datasource which does not derive from ILIST
                    try
                    
    {
                        dataSource 
    = (IList)value;
                        ItemCount 
    = dataSource.Count;
                    }

                    
    catch
                    
    {
                        dataSource 
    = null;
                        ItemCount 
    = 0;
                    }

                }

            }


            
    /// <summary>
            
    /// 每页大小
            
    /// </summary>

            public int PageSize
            
    {
                
    get return pageSize; }
                
    set { pageSize = value; }
            }


            
    /// <summary>
            
    /// 总页数
            
    /// </summary>

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


            
    /// <summary>
            
    /// 可重载,数据条目总数
            
    /// </summary>

            virtual protected int ItemCount
            
    {
                
    get return itemCount; }
                
    set { itemCount = value; }
            }


            
    /// <summary>
            
    /// 可重载,当前页码
            
    /// </summary>

            virtual public int CurrentPageIndex
            
    {
                
    get return currentPageIndex; }
                
    set { currentPageIndex = value; }
            }


            
    /// <summary>
            
    /// 空Text
            
    /// </summary>

            public string EmptyText
            
    {
                
    set { emptyText = value; }
            }


            
    /// <summary>
            
    /// 设置页面,翻页事件
            
    /// </summary>
            
    /// <param name="index"></param>

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


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

            }



            
    /// <summary>
            
    /// Overriden method to control how the page is rendered
            
    /// Render提交写入
            
    /// </summary>
            
    /// <param name="writer"></param>

            override protected void Render(HtmlTextWriter writer)
            
    {

                
    //Check there is some data attached
                if (ItemCount == 0)
                
    {
                    writer.Write(emptyText);
                    
    return;
                }


                
    //Mask the query "?"/"&"二个符号
                string query = Context.Request.Url.Query.Replace(COMMA, AMP);
                
    //正则表达式替换
                query = RX.Replace(query, string.Empty);


                
    // Write out the first part of the control, the table header
                writer.Write(HTML1);

                
    // Call the inherited method
                base.Render(writer);

                
    // Write out a table row closure
                writer.Write(HTML2);

                
    if (currentPageIndex > 0)
                writer.Write(
    string.Format(LINK_FIRST, 0 + query) + "&nbsp;");     //首页
                
    //Determin whether next and previous buttons are required
                
    //Previous button?
                if (currentPageIndex > 0)
                    writer.Write(
    string.Format(LINK_PREV, (currentPageIndex - 1+ query));

                
    //Close the table data tag
                
    //writer.Write(HTML3);

                
    //当前页/总页数
                writer.Write("&nbsp;&nbsp;" + string.Format("页码:{0}/{1}", currentPageIndex + 1, PageCount + 1+ "&nbsp;&nbsp;");

                
    //writer.Write(HTML5);

                
    //Next button?
                if (currentPageIndex < PageCount)
                    writer.Write(
    string.Format(LINK_MORE, (currentPageIndex + 1+ query));
                
    if (currentPageIndex < PageCount)
                writer.Write(
    "&nbsp;" + string.Format(LINK_LAST, PageCount + query));      //尾页

                
    //Close the table
                writer.Write(HTML4);
            }


            
    override protected void OnDataBinding(EventArgs e)
            
    {

                
    //Work out which items we want to render to the page
                int start = CurrentPageIndex * pageSize;
                
    int size = Math.Min(pageSize, ItemCount - start);

                IList page 
    = new ArrayList();

                
    //Add the relevant items from the datasource
                for (int i = 0; i < size; i++)
                    page.Add(dataSource[start 
    + i]);

                
    //set the base objects datasource
                base.DataSource = page;
                
    base.OnDataBinding(e);

            }


            
    /// <summary>
            
    /// 翻页事件
            
    /// </summary>

            public event DataGridPageChangedEventHandler PageIndexChanged;

            
    /// <summary>
            
    /// 可重载,翻页事件处理
            
    /// </summary>
            
    /// <param name="e"></param>

            virtual protected void OnPageIndexChanged(DataGridPageChangedEventArgs e)
            
    {
                
    if (PageIndexChanged != null)
                    PageIndexChanged(
    this, e);
            }

        }

    }
  • 相关阅读:
    10 个非常有用的 AngularJS 框架
    15个最新加速 Web 开发的框架和工具
    最新13个加速 Web 开发的框架和工具
    7款个性化jQuery/HTML5地图插件
    19款绚丽实用的jQuery/CSS3侧边栏菜单
    7 个顶级的 HTML5 Canvas 动画赏析
    10款精美的web前端源码的特效
    10款web前端基于html5/CSS3应用特效
    8个强大的基于Bootstrap的CSS框架
    7款经典炫酷的HTML5/jQuery动画应用示例及源码
  • 原文地址:https://www.cnblogs.com/sjett/p/430834.html
Copyright © 2011-2022 走看看