【发布时间】:2012-02-07 13:28:00
【问题描述】:
我创建了一个自定义分页类 -Pagger- 来实现列表控件的分页。
现在,Pagger 对象生成一个 ASP:Panel,其中包含导航 btns -ASP:LinkButton- 负责导航,每个生成的 btn 都在其中存储 pageNumber它必须导航到的位置
示例:
为了增强分页,我使用 Ajax -ASP:UpdatePanel- 包围了 paging panel,
现在,在每个btn's click 发生PostBack 时,我在OnPreInit 页面事件中重新创建了所有btns 以让它们再次可用-很明显,这不是问题-
protected override void OnPreInit(EventArgs e)
{
Pagger p = new Pagger(itemsCount, itemsPerPage);
//Here the pager reads from viewstate to know
//which pageNumber is the currentPage and generates btns according to it
p.GeneratePaggerPanel(CurrentPageNumber);
Panel1.Controls.Add(p.PaggerPanel);
//link the LinkBtn to event handler to be executed upon clicking
foreach (Control c in p.PaggerPanel.Controls)
{
if (c is LinkButton)
{
((LinkButton)c).Click += Button1_Click;
}
}
base.OnPreInit(e);
}
现在,为了知道哪个pageNumber是currentPageNumber,我把它存储在ViewState中
public uint CurrentPageNumber
{
get
{
if (ViewState["CurrentPageNumber"] != null)
return (uint)ViewState["CurrentPageNumber"];
return 1;
}
set
{
ViewState["CurrentPageNumber"] = value;
}
}
protected void Button1_Click(object sender, EventArgs e)
{
CurrentPageNumber = ((PaggerLinkButton)sender).Tag;
}
但是btnEvent Click 在page_load 之后触发,这意味着当re-creating pager btns 在OnPreInit 事件中时ViewState 将不可用
如何在初始化pager btns panel 之前通过读取pressed btn's value 来设置ViewState 值,以便寻呼机可以在同一个PostBack 中使用currentPageNumber 并且不要等待再做另一个PostBack?
我也读过ASP.NET Page Life Cycle Overview,但没有任何帮助。
P.S.:PaggerLinkButton 继承自 LinkButton 并带有一个新属性 Tag
【问题讨论】:
标签: c# asp.net ajax postback viewstate