【问题标题】:Read dynamic control's value after PostBack for custom paging在 PostBack 之后读取动态控件的值以进行自定义分页
【发布时间】: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);
    }

现在,为了知道哪个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 Clickpage_load 之后触发,这意味着当re-creating pager btnsOnPreInit 事件中时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


    【解决方案1】:

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

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

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

    希望这会有所帮助, 干杯, 尼克

    【讨论】:

      猜你喜欢
      • 2011-08-14
      • 2010-09-09
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多