/// <summary>
    /// 分页通用类
    /// </summary>
    public class PageF
    {
        /// <summary>
        /// 页总数
        /// </summary>
        public int PageCount
        {
            get
            {
                if (AllCount > RecordCount)
                {
                    if (AllCount % RecordCount == 0)
                        return AllCount / RecordCount;
                    else
                        return AllCount / RecordCount + 1;
                }
                else if (AllCount == 0)
                    return 0;
                return 1;
            }
        }
        /// <summary>
        /// 总记录数
        /// </summary>
        public int AllCount
        {
            get
            {
                string sql = "select count(*) from " + Tablename;
                return Convert.ToInt32(DBHelp.GetScaleSql(sql));
            }
        }        private int _recordCount;
        /// <summary>
        /// 每次取出记录数
        /// </summary>
        public int RecordCount
        {
            get { return _recordCount; }
            set { _recordCount = value; }
        }        private int _curIndex;
        /// <summary>
        /// 当前页
        /// </summary>
        public int CurIndex
        {
            get { return _curIndex; }
            set { _curIndex = value; }
        }        private int _pagesChange;        public int PagesChange
        {
            get { return _pagesChange; }
            set { _pagesChange = value; }
        }        /// <summary>
        /// 页码
        /// </summary>
        /// <param name="count">页总数</param>
        /// <returns></returns>
        public string PageIndex(int count)
        {
            StringBuilder sbuider = new StringBuilder("<a class='" + CssClass + "' href='" + LinkUrl + 1 + "'>首页</a>");
            sbuider.Append("&nbsp;");
            if (count > PagesChange)
            {
                if (CurIndex < PagesChange)
                {
                    for (int i = 1; i < PagesChange + 1; i++)
                    {
                        sbuider.AppendFormat("<a class='{0}' href='{1}'>" + i + "</a>", CssClass, LinkUrl + i);
                    }
                    sbuider.Append("..."); 
                }
                else
                {
                    sbuider.Append(LinkContext(count));
                }
            }
            else
            {
                for (int i = 1; i < count + 1; i++)
                {
                    sbuider.AppendFormat("<a class='{0}' href='{1}'>" + i + "</a>", CssClass, LinkUrl + i);
                    sbuider.Append("&nbsp;");
                }
            }
            sbuider.AppendFormat("<a class='{0}' href='{1}'>尾页</a>", CssClass, LinkUrl + count);
            return sbuider.ToString();
        }        private static int recode = 0;
        private static bool blag = true;        private string LinkContext(int count)
        {
            if (CurIndex != count && CurIndex % PagesChange == 0) PageF.blag = true;
            if (PageF.blag)
            {
                PageF.recode = CurIndex;
                PageF.blag = false;
            }
            StringBuilder builder = new StringBuilder();
            int currPagesChange = count - PageF.recode - PagesChange;
            if (CurIndex < count)
            {
                int p = 0;
                if (PagesChange + PageF.recode > count)
                    p = count;
                else
                    p = PagesChange + PageF.recode;
                for (int i = PageF.recode + 1; i < p + 1; i++)
                {
                    builder.AppendFormat("<a class='{0}' href='{1}'>" + i + "</a>", CssClass, LinkUrl + i);
                    builder.Append("&nbsp;");
                }
            }
            if (currPagesChange > 0) builder.Append("...");
            return builder.ToString();
        }        private string _cssClass;        public string CssClass
        {
            get { return _cssClass; }
            set { _cssClass = value; }
        }        private string _LinkUrl;        public string LinkUrl
        {
            get { return _LinkUrl; }
            set { _LinkUrl = value; }
        }        private string _tablename;
        /// <summary>
        /// 从哪张表获取数据
        /// </summary>
        public string Tablename
        {
            get { return _tablename; }
            set { _tablename = value; }
        }
        /// <summary>
        /// 获取主键
        /// </summary>
        /// <returns></returns>
        public string GetPri
        {
            get
            {
                string sql = "select c.name,t.name from sysindexes i"
                + " join sysindexkeys k on i.id = k.id and i.indid = k.indid"
                + " join sysobjects o on i.id = o.id"
                + " join syscolumns c on i.id=c.id and k.colid = c.colid"
                + " join sys.types AS t ON c.type=t.user_type_id"
                + " where o.xtype = 'U' and o.name='" + Tablename + "'"
                + " and exists(select 1 from sysobjects where xtype = 'PK' and name = i.name)";
                SqlDataReader dr = DBHelp.CreateReader(sql);
                Dictionary<string, object> dic = new Dictionary<string, object>();
                while (dr.Read())
                {
                    dic.Add(dr[0].ToString(), dr[1]);
                }
                string primary = "";
                foreach (string item in dic.Keys)
                {
                    if (dic[item].ToString() == "int")
                    {
                        primary = item;
                        break;
                    }
                }
                return primary;
            }
        }
        public string Fsql()
        {
            string primary = GetPri;
            string sql = "select top " + RecordCount + " * from " + Tablename + " where " + primary
+ " not in(select top " + (CurIndex - 1) * RecordCount + " " + primary + " from " + Tablename + " order by " + primary + ") order by " + primary;
            return sql;
        }
    }

解决方案 »

  1.   

    挺好,对于倒序显示的话,外面还要接一层,然后order by "primary" desc
      

  2.   


        /// <summary>
        /// 分页数据
        /// </summary>
        public class PageData
        {
            public PageData(int pageindex, int pagesize)
            {
                pageIndex = pageindex;
                pageSize = pagesize;
            }
            private int pageIndex;        /// <summary>
            /// 当前页
            /// </summary>
            public int PageIndex
            {
                get { return pageIndex; }
                set { pageIndex = value; }
            }
            private int recordsCount;        /// <summary>
            /// 总记录条数
            /// </summary>
            public int RecordsCount
            {
                get { return recordsCount; }
                set { recordsCount = value; }
            }
            private int pageSize;        /// <summary>
            /// 一页的记录条数
            /// </summary>
            public int PageSize
            {
                get { return pageSize; }
                set { pageSize = value; }
            }        /// <summary>
            /// 总页数
            /// </summary>
            public int PageCount
            {
                get
                {
                    if (recordsCount != 0)
                    {
                        return this.RecordsCount % this.PageSize == 0 ? this.RecordsCount / this.PageSize : this.RecordsCount / this.PageSize + 1;
                    }
                    else
                    {
                        return 0;
                    }
                }
            }
        }
       public delegate DataTable ExecutPage(PageData pagedata, string strWhere, out int records);
        public class PagerClass
        {
            public PagerClass(ExecutPage executpagehandl, PageData ppagedata)
            {
                ExecutPageHandl = executpagehandl;
                pagedata = ppagedata;
            }
            public ExecutPage ExecutPageHandl;        private PageData pagedata;        /// <summary>
            /// 获得分页导航 , 非AJAX提交分页
            /// </summary>
            /// <param name="pagedata">分页数据</param>
            /// <param name="urlPath">提交地址</param>
            /// <param name="linkcount">生成链接个数</param>
            /// <returns>HTML导航</returns>
            public string GetPageNavigat(string urlPath, int linkcount, string strWhere, out DataTable dsData, out int records)
            {
                StringBuilder output = new StringBuilder();
                dsData = null;
                records = 0;
                if (pagedata != null)
                {
                    dsData = ExecutPageHandl(pagedata, strWhere, out records);
                    pagedata.RecordsCount = records;
                    if (pagedata.PageCount > 0)
                    {
                        output.Append("<div class=\"pager\">");
                        output.Append("<a href=\"" + urlPath + "&page=1\">首页</a>\r\n");                    if (pagedata.PageIndex > 1)
                        {
                            output.Append("<a href=\"" + urlPath + "&page=" + Convert.ToString(pagedata.PageIndex - 1) + "\">上一页</a>\r\n");
                        }                    for (int i = 0; i <= linkcount * 2; i++)
                        {
                            //一共最多显示linkcount * 2个页码,前面linkcount ,后面linkcount 个
                            if ((pagedata.PageIndex + i - linkcount) >= 1 && (pagedata.PageIndex + i - linkcount) <= pagedata.PageCount)
                            {
                                if (linkcount == i)
                                {
                                    //当前页处理
                                    output.Append(string.Format("<span class=\"current\">{0}</span>\r\n", pagedata.PageIndex));
                                }
                                else
                                {
                                    //一般页处理
                                    output.Append("<a href=\"" + urlPath + "&page=" + Convert.ToString(pagedata.PageIndex + i - linkcount) + "\">" + Convert.ToString(pagedata.PageIndex + i - linkcount) + "</a>\r\n");
                                }
                            }
                            output.Append(" ");
                        }
                        if (pagedata.PageIndex < pagedata.PageCount)
                        {
                            //处理下一页的链接
                            output.Append("<a href=\"" + urlPath + "&page=" + Convert.ToString(pagedata.PageIndex + 1) + "\">下一页</a>\r\n");
                        }
                        output.Append(" ");
                        if (pagedata.PageIndex != pagedata.PageCount)
                        {
                            output.Append("<a href=\"" + urlPath + "&page=" + pagedata.PageCount.ToString() + "\">尾页</a>\r\n");
                        }
                        output.Append(" ");
                        output.AppendFormat("{0}", "<span class=\"total\">第" + pagedata.PageIndex + "/" + pagedata.PageCount + "页</span></div>");
                    }
                }      
                return output.ToString();
            }
    }
    主要想法是自写查询数据的逻辑,定义一个委托,查询函数遵循这个委托就行了调用方法:/// <summary>
            /// 绑定相册信息
            /// </summary>
            /// <param name="aid"></param>
            protected void BindPhotos(string aid, int pageindex, int pagesize)
            {
                int pageTotal = 0;
                PageData pd = new PageData(pageindex, pagesize);
                ExecutPage Ep = GetPagePhoto;
                PagerClass pageclass = new PagerClass(Ep, pd);
                DataTable dsphoto = null;
                PageNav = pageclass.GetPageNavigat("index.aspx?b=1&uid=" + CurrentUserID.ToString() + "&aid=" + aid, 5, "[AlbumID]=" + aid + " and [UserID]=" + CurrentUserID.ToString() + " and IsLock=0", out dsphoto, out pageTotal);
                repPhotos.DataSource = dsphoto.DefaultView;
                repPhotos.DataBind();
            }        public DataTable GetPagePhoto(PageData pagedata, string strWhere, out int records)
            {
                records = 0;
                SolaSNS.BLL.sns_photo bllsns_photo = new SolaSNS.BLL.sns_photo();
                DataTable dsphoto = bllsns_photo.GetList("sns_photo", "PhotoID", pagedata.PageSize, pagedata.PageIndex, strWhere, ref records).Tables[0];
                return dsphoto;
            }上面的GetPagePhoto方法就是遵循委托的自写查询逻辑额,,不知道会不会被BS有什么不好的地方请提出来.. 上面的委托参数strWhere可以改成一个你想要的参数...