在PostBack之后读取动态控件的值以进行自定义分页

时间:2012-01-11 06:28:39

标签: c# asp.net ajax postback viewstate

我已经创建了一个自定义分页类 - Pagger - 来实现列表控件的分页。

现在,Pagger对象生成一个ASP:Panel,其中包含导航btns - ASP:LinkButton - 负责导航,每个生成的btn都在其中存储pageNumber它必须导航到

示例:
enter image description here

为了增强分页,我使用了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);
    }

现在,为了知道pageNumbercurrentPageNumber,我将其存储在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}}

1 个答案:

答案 0 :(得分:0)

你有几个选择(我可以考虑一下)。

  1. 将服务器端Button1_click方法替换为链接按钮的客户端单击事件处理程序。此客户端方法应将页面值设置为窗体上的隐藏控件。请注意,您不需要具有tag属性的自定义linkbutton类。只需在客户端设置页面值onclick处理程序代码(例如,OnClick ='setPageNo(x); return true;')。然后在OnPreInit中从隐藏控件中获取currentpagenumber。

  2. 我不确定为什么要在每个回发中重新创建PaggerPanel控件(而不是依赖于viewstate),但是,您应该能够将GeneratePaggerPanel方法中的逻辑分离到(a)Panel创建myPanel = p。 GeneratePaggerPanel()在OnPreInit中完成,(b)当前页面特定更改p.FixPaggerPanel(myPanel,CurrentPageNo),它在Button1_click方法中完成。

  3. 希望这有帮助, 干杯, 尼克