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

时间:2010-02-03 18:12:01

标签: c# asp.net repeater

我有一个自定义转发器控件,它继承自Repeater并具有分页功能,但是当我第一次刷新控件但没有更改页面时单击下一页按钮,如果我再次单击它后会更改页面完美。

我知道问题是什么,当我点击下一个按钮进行回发,然后数据绑定到转发器,然后处理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();
    }
}
}

2 个答案:

答案 0 :(得分:0)

在页面更改功能中调用“this.DataBind()”。

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

答案 1 :(得分:0)

这里有几个问题突然发生在我身上。

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

中执行

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

最后,触发DataBind的是什么?什么事件处理器?必须从托管此控件的页面调用它。如果是这种情况,那么您还需要将Next / Prev点击作为事件公开,以便可以响应这些事件调用DataBind。这就是Microsoft处理分页工作的控件,例如GridView。 NextBtn.Click或PrevBtn.Click保证是最后处理的回发事件。

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