我已经创建了一个自定义分页类 - Pagger
- 来实现列表控件的分页。
现在,Pagger
对象生成一个ASP:Panel
,其中包含导航btns - ASP:LinkButton
- 负责导航,每个生成的btn都在其中存储pageNumber
它必须导航到
示例:
为了增强分页,我使用了Ajax - ASP:UpdatePanel
- 来包围paging panel
,
现在,每btn's click
PostBack
发生一次,所以我重新创建了btns
页面事件中的所有OnPreInit
,让它们再次可用 - 这很明显,而且不是问题 -
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
,这意味着ViewState
re-creating
pager btns
OnPreInit
事件中ViewState
将无法使用pressed btn's value
/>
如何在初始化pager btns panel
之前阅读currentPageNumber
来设置PostBack
值,以便寻呼机可以使用同一PostBack
中的PaggerLinkButton
并且不要等待做另一个LinkButton
?
我也读过ASP.NET Page Life Cycle Overview,但没有任何帮助我。
P.S。:Tag
继承自{{1}}一个新属性{{1}}
答案 0 :(得分:0)
你有几个选择(我可以考虑一下)。
将服务器端Button1_click方法替换为链接按钮的客户端单击事件处理程序。此客户端方法应将页面值设置为窗体上的隐藏控件。请注意,您不需要具有tag属性的自定义linkbutton类。只需在客户端设置页面值onclick处理程序代码(例如,OnClick ='setPageNo(x); return true;')。然后在OnPreInit中从隐藏控件中获取currentpagenumber。
我不确定为什么要在每个回发中重新创建PaggerPanel控件(而不是依赖于viewstate),但是,您应该能够将GeneratePaggerPanel方法中的逻辑分离到(a)Panel创建myPanel = p。 GeneratePaggerPanel()在OnPreInit中完成,(b)当前页面特定更改p.FixPaggerPanel(myPanel,CurrentPageNo),它在Button1_click方法中完成。
希望这有帮助, 干杯, 尼克