分页控件代码不是很熟悉,现在遇到一个很傻的情况。数据源是用DataSource
并附上分页源代码分页源代码太长,没有办法贴出来,我贴在回贴里
我现在遇到的问题我在页面里使用了两个分面引用
代码如下:
<uc1:Pager ID="Pager1" runat="server" ControlToBePaged="list1" DataSource="<%# GetImageList() %>" NumbersCount="5" PageSize="20" SkinPath="~/PagerSkin1.ascx" /><uc1:Pager ID="Pager2" runat="server" ControlToBePaged="list1" DataSource="<%# GetImageList() %>" NumbersCount="5" PageSize="20" SkinPath="~/PagerSkin1.ascx" />分页代码可以正常显示出来,但我用其中任何一个点击分页,另一个没有同步。这个问题要如何改呢。我是一个.net新手,这样的问题没有做过,请高手可以附上要修改的代码嘛。

解决方案 »

  1.   

    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.ComponentModel;
    using System.Reflection;
    using System.Collections.Generic;namespace PumpersShow {
        public partial class Pager: CtrlBase {
            protected void Page_Load(object sender, EventArgs e) {
                
            }        [IDReferenceProperty, TypeConverter(typeof(ControlIDConverter)),
                DefaultValue("")]
            public string ControlToBePaged {
                get {
                    object obj1 = this.ViewState["ControlToBePaged"];
                    if (obj1 != null) {
                        return (string)obj1;
                    }
                    return string.Empty;
                }
                set {
                    this.ViewState["ControlToBePaged"] = value;
                }
            }        public string SkinPath {
                get {
                    string s = (string)ViewState["SkinPath"];
                    return (s == null) ? "" : s;
                }
                set {
                    ViewState["SkinPath"] = value;
                }
            }        protected override void OnInit(EventArgs e) {
                base.OnInit(e);            if (SkinPath.Length > 0) {
                    try {
                        UserControl skin = LoadControl(SkinPath) as UserControl;
                        FormView fv = skin.FindControl("formView1") as FormView;
                        this.formView1.InsertItemTemplate = fv.InsertItemTemplate;
                    } catch { }
                }
                formView1.ItemCommand += new FormViewCommandEventHandler(formView1_ItemCommand);
                formView1.ItemCreated += new EventHandler(formView1_ItemCreated);           
            }        // 附加事件绑定。
            void formView1_ItemCreated(object sender, EventArgs e) {
                Literal litRecordCount = formView1.FindControl("litRecordCount") as Literal;            if (litRecordCount != null) {
                    litRecordCount.Text = RecordCount.ToString();
                }            Literal litPageNumber = formView1.FindControl("litPageNumber") as Literal;            if (litPageNumber != null) {
                    litPageNumber.Text = CurrentPage.ToString();
                }
                
                Literal litPageCount = formView1.FindControl("litPageCount") as Literal;            if (litPageCount != null) {
                    litPageCount.Text = PageCount.ToString();
                }            Repeater rptPageNumbers = formView1.FindControl("rptPageNumbers") as Repeater;            if (rptPageNumbers != null) {
                    rptPageNumbers.DataSource = GetPageNumbers();
                    rptPageNumbers.ItemCommand += new RepeaterCommandEventHandler(rptPageNumbers_ItemCommand);
                    rptPageNumbers.ItemDataBound += new RepeaterItemEventHandler(rptPageNumbers_ItemDataBound);
                }           
            }        void rptPageNumbers_ItemDataBound(object sender, RepeaterItemEventArgs e) {
                LinkButton btnPageNumber = e.Item.FindControl("btnPageNumber") as LinkButton;
                if (btnPageNumber != null) {
                    btnPageNumber.Text = e.Item.DataItem.ToString();
                    btnPageNumber.CommandArgument = e.Item.DataItem.ToString();
                }
            }
      

  2.   

    private DataTable _dataSource;        public DataTable DataSource {
                get { return _dataSource; }
                set {
                    _dataSource = value;
                }
            }        protected string[] GetPageNumbers() {
                int max = NumbersCount;
                int start = 0;
                int end = 0;            if (max >= PageCount) {
                    start = 1;
                    end = PageCount;
                } else {
                    if (PageCount - CurrentPage + 1 < max) {
                        start = PageCount - max + 1;
                        end = PageCount;
                    } else if (CurrentPage < max) {
                        start = 1;
                        end = max;
                    } else {
                        start = CurrentPage;
                        end = CurrentPage + max - 1;
                    }
                }
                List<string> numbers = new List<string>();
                for (int i = start; i <= end; i++) {
                    numbers.Add(i.ToString());
                }            return numbers.ToArray();
            }        protected void formView1_ItemCommand(object sender, FormViewCommandEventArgs e) {
                if (e.CommandName == "Page") {
                    switch (e.CommandArgument.ToString()) {
                        case "First":
                            CurrentPage = 1;
                            break;                    case "Prev":
                            int currentPage = CurrentPage - 1;
                            if (currentPage < 1) currentPage = 1;
                            CurrentPage = currentPage;
                            break;                    case "Next":
                            int currentPage2 = CurrentPage + 1;
                            if (currentPage2 > PageCount) currentPage2 = PageCount;
                            CurrentPage = currentPage2;
                            break;                    case "Last":
                            CurrentPage = PageCount;
                            break;                    default: // 直接回传数字的情况
                            CurrentPage = int.Parse(e.CommandArgument.ToString());
                            break;
                    }
                    DataBind();
                }
            }        // event bubbling.
            protected void rptPageNumbers_ItemCommand(object sender, RepeaterCommandEventArgs e) {
                Repeater rpt = (Repeater)sender;
                FormViewCommandEventHandler handler = formView1_ItemCommand;
                handler(formView1, new FormViewCommandEventArgs(rpt, e));
            }
            
            protected override void OnDataBinding(EventArgs e) {
                base.OnDataBinding(e);            BindList();
            }        #region 分页属性        /// <summary>
            /// 中间显示的页码最大数目
            /// </summary>
            public int NumbersCount {
                get {
                    return (ViewState["NumbersCount"] == null) ?
                        10 : (int)ViewState["NumbersCount"];
                }
                set {
                    ViewState["NumbersCount"] = value;
                }
            }        /// <summary>
            /// 页大小
            /// </summary>
            public int PageSize {
                get {
                    return (ViewState["PageSize"] == null) ?
                        10 : (int)ViewState["PageSize"];
                }
                set {
                    ViewState["PageSize"] = value;
                }
            }        /// <summary>
            /// 总页数
            /// </summary>
            protected int PageCount {
                get {
                    return (ViewState["PageCount"] == null) ?
                        1 : (int)ViewState["PageCount"];
                }
                set { ViewState["PageCount"] = value; }
            }        /// <summary>
            /// 总记录数
            /// </summary>
            protected int RecordCount {
                get {
                    return (ViewState["RecordCount"] == null) ?
                        1 : (int)ViewState["RecordCount"];
                }
                set { ViewState["RecordCount"] = value; }
            }        /// <summary>
            /// 当前页
            /// </summary>
            protected int CurrentPage {
                get {
                    return (ViewState["CurrentPage"] == null) ?
                        1 : (int)ViewState["CurrentPage"];
                }
                set { ViewState["CurrentPage"] = value; }
            }
            #endregion        private void BindList() {
                PagedDataSource pds = new PagedDataSource();
                pds.DataSource = DataSource.DefaultView;            pds.AllowPaging = true;
                pds.PageSize = PageSize;            pds.CurrentPageIndex = CurrentPage - 1;            PageCount = pds.PageCount;
                RecordCount = DataSource.Rows.Count;            // 方法1:引发分页事件
                //
                //PageIndexChangedEventArgs e = new PageIndexChangedEventArgs();
                //e.PagedDataSource = pds;
                //OnPageIndexChanged(e);            // 方法2:用反射(限制了被分页的控件必须有 DataSource 属性)
                //
                Control c = this.NamingContainer.FindControl(ControlToBePaged);
                if (c == null)
                    throw new Exception("没有设置要分页的控件");
                
                PropertyInfo pi = c.GetType().GetProperty("DataSource");
                
                if(pi == null)
                    throw new Exception("目标控件没有 DataSource 属性");
                
                pi.SetValue(c, pds, null);
                c.DataBind();
            }        // 方法1 的相关代码:
            //public event EventHandler<PageIndexChangedEventArgs> PageIndexChanged
            //{
            //    add
            //    {
            //        Events.AddHandler(PageIndexChangedEvent, value);
            //    }
            //    remove
            //    {
            //        Events.RemoveHandler(PageIndexChangedEvent, value);
            //    }
            //}        //private static object PageIndexChangedEvent = new object();        //public void OnPageIndexChanged(PageIndexChangedEventArgs e)
            //{
            //    EventHandler<PageIndexChangedEventArgs> handler = Events[PageIndexChangedEvent]
            //        as EventHandler<PageIndexChangedEventArgs>;        //    if (handler != null)
            //    {
            //        handler(this, e);
            //    }
            //}
        }    //public class PageIndexChangedEventArgs : EventArgs
        //{
        //    private PagedDataSource _pds;    //    public PagedDataSource PagedDataSource
        //    {
        //        get { return _pds; }
        //        set { _pds = value; }
        //    }
        //}
    }
      

  3.   

    原因应该是两个控件是相互独立的,点击一个控件的分页按钮后引发了分页事件,但另一个控件却没有引发,你可以试试我写的 AspNetPager 免费自定义的分页控件,设置好一个控件的属性后另一个控件只要将它的CloneFrom属性指向第一个控件的ID就可以同步,不需要再设置相应的属性及编写事件处理程序了,可以从这里下载示例及文档:http://www.webdiyer.com