我有一个自定义转发器控件,它继承自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();
}
}
}
答案 0 :(得分:0)
在页面更改功能中调用“this.DataBind()”。
这意味着您在更改页面时数据绑定两次但会起作用: - \
答案 1 :(得分:0)
这里有几个问题突然发生在我身上。
一,为什么要动态创建上一个/下一个按钮?把它们放在ASCX中。根据您的页面索引是第一个还是最后一个,根据需要显示/隐藏它们。如果必须动态创建它们,请在Init ...
中执行二,不要将您的页面索引存储在会话中。当您在一个页面上有两个这样的自定义中继器时会发生什么?使用ViewState。如有必要,将字符串名称键入控件ID,但我认为ViewState会自动执行此操作(?)。
最后,触发DataBind的是什么?什么事件处理器?必须从托管此控件的页面调用它。如果是这种情况,那么您还需要将Next / Prev点击作为事件公开,以便可以响应这些事件调用DataBind。这就是Microsoft处理分页工作的控件,例如GridView。 NextBtn.Click或PrevBtn.Click保证是最后处理的回发事件。
你可以在内部处理下一个/ prev,但如果你要这样做,你还需要在代码中调用DataBind(),以便它在正确的时间发生。