C# 自定义分页中继器控制数据绑定后发生的下一个和上一个事件

C# 自定义分页中继器控制数据绑定后发生的下一个和上一个事件,c#,asp.net,repeater,C#,Asp.net,Repeater,我有一个自定义的Repeater控件,它继承自Repeater并具有分页功能,但是,当我第一次单击“下一页”按钮时,它会刷新控件但不会更改页面,如果在之后再次单击它,它会完全更改页面 我知道问题是什么,当我单击next按钮时,它会进行回发,然后数据会绑定到中继器,然后处理NextButton事件 是否有任何方法可以更改页面加载事件的顺序??或者在事件处理后强制中继器重新加载 我已经包括了我的自定义中继器类: using System.Web.UI.WebControls; using Syste

我有一个自定义的Repeater控件,它继承自Repeater并具有分页功能,但是,当我第一次单击“下一页”按钮时,它会刷新控件但不会更改页面,如果在之后再次单击它,它会完全更改页面

我知道问题是什么,当我单击next按钮时,它会进行回发,然后数据会绑定到中继器,然后处理NextButton事件

是否有任何方法可以更改页面加载事件的顺序??或者在事件处理后强制中继器重新加载

我已经包括了我的自定义中继器类:

using System.Web.UI.WebControls;
using System.Web.UI;
using System.Data;
using System.Collections;
using System;

namespace ASPresentation.Controls
{
[ToolboxData("<cc:PagedRepeater runat=server></cc:PagedRepeater>")]
public class PagedRepeater : Repeater
{
    public int PageSize { get; set; }
    public int CurrentPageIndex
    {
        get
        {
            return Convert.ToInt16(Page.Session["ProjectIndex"]);
        }
        set
        {
            Page.Session.Add("ProjectIndex", value);
        }
    }
    public PagedDataSource pagedData = new PagedDataSource();
    LinkButton NextBtn = new LinkButton();
    LinkButton PrevBtn = new LinkButton();

    public bool IsLastPage
    {
        get
        {
            return pagedData.IsLastPage;
        }
    }
    public bool IsFirstPage
    {
        get
        {
            return pagedData.IsFirstPage;
        }
    }

    public override object DataSource
    {
        get
        {
            return base.DataSource;
        }
        set
        {
            pagedData.DataSource = (IEnumerable)value;
        }
    }

    protected void NextButtonClick(object sender, EventArgs e)
    {
        if (!IsLastPage)
        {
            CurrentPageIndex++;
        }
    }

    protected void PrevButtonClick(object sender, EventArgs e)
    {
        if (!IsFirstPage)
        {
            CurrentPageIndex--;
        }
    }

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        NextBtn.Text = "Next";
        PrevBtn.Text = "Prev";
        NextBtn.Click += new EventHandler(NextButtonClick);
        PrevBtn.Click += new EventHandler(PrevButtonClick);
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        base.Controls.Add(PrevBtn);
        base.Controls.Add(NextBtn);
    }

    protected override void Render(HtmlTextWriter writer)
    {
        base.Render(writer);
    }

    public override void DataBind()
    {
        pagedData.AllowPaging = true;
        pagedData.PageSize = PageSize;
        pagedData.CurrentPageIndex = CurrentPageIndex;
        base.DataSource = pagedData;
        base.DataBind();
    }
}
}
使用System.Web.UI.WebControls;
使用System.Web.UI;
使用系统数据;
使用系统集合;
使用制度;
命名空间ASPresentation.Controls
{
[ToolboxData(“”)
公共类PagedRepeater:中继器
{
公共int PageSize{get;set;}
公共页面索引
{
得到
{
返回Convert.ToInt16(Page.Session[“ProjectIndex]”);
}
设置
{
第页。会话。添加(“ProjectIndex”,值);
}
}
public PagedDataSource pagedData=新的PagedDataSource();
LinkButton NextBtn=新建LinkButton();
LinkButton PrevBtn=新建LinkButton();
公共布尔IsLastPage
{
得到
{
返回pagedData.IsLastPage;
}
}
公共图书馆是第一页
{
得到
{
返回pagedData.IsFirstPage;
}
}
公共覆盖对象数据源
{
得到
{
返回base.DataSource;
}
设置
{
pagedData.DataSource=(IEnumerable)值;
}
}
受保护的void NextButtonClick(对象发送方,事件参数e)
{
如果(!IsLastPage)
{
CurrentPageIndex++;
}
}
受保护的无效PrevButtonClick(对象发送方,事件参数e)
{
如果(!IsFirstPage)
{
当前页面索引--;
}
}
受保护的覆盖无效OnInit(事件参数e)
{
碱基.奥尼特(e);
NextBtn.Text=“下一步”;
PrevBtn.Text=“Prev”;
NextBtn.Click+=neweventhandler(NextButtonClick);
PrevBtn.Click+=新建事件处理程序(PrevButtonClick);
}
受保护的覆盖无效加载(事件参数e)
{
基础荷载(e);
base.Controls.Add(PrevBtn);
base.Controls.Add(NextBtn);
}
受保护的覆盖无效渲染(HtmlTextWriter编写器)
{
base.Render(writer);
}
公共覆盖无效数据绑定()
{
pagedData.allowpage=true;
pagedData.PageSize=页面大小;
pagedData.CurrentPageIndex=CurrentPageIndex;
base.DataSource=pagedData;
base.DataBind();
}
}
}
在页面更改函数中调用“this.DataBind()”


这意味着您在更改页面时会进行两次数据绑定,但会起作用:-\

这里有几个问题会跳到我身上

第一,为什么要动态创建prev/next按钮?把它们放在ASCX里。根据页面索引是否为第一个/最后一个显示/隐藏它们。如果您必须动态创建它们,请在Init中创建它们

第二,不要像那样在会话中存储页面索引。当一个页面上有两个这样的自定义转发器时会发生什么?使用ViewState。如果需要,将字符串名称键入控件ID,但我认为ViewState会自动执行此操作(?)

最后,触发数据绑定的是什么?什么事件处理程序?必须从承载此控件的页面调用它。如果是这种情况,那么您还需要将Next/Prev单击作为事件公开,以便可以调用DataBind来响应这些事件。这就是微软处理分页工作的控件,比如GridView。nextbttn.Click或PrevBtn.Click保证是处理的最后一个回发事件


您可以在内部处理next/prev,但如果要这样做,还需要在代码中调用DataBind(),以便它在正确的时间发生。

我尝试过,它使我的按钮失效,可能是因为它在重新渲染时没有先执行init并在添加按钮的地方加载。