Asp.net 以编程方式将PagedControl ID分配给DataPAger

Asp.net 以编程方式将PagedControl ID分配给DataPAger,asp.net,viewstate,page-lifecycle,datapager,Asp.net,Viewstate,Page Lifecycle,Datapager,因此,我认为,我正在努力解决的更多是页面生命周期/视图状态问题。我有一个包含三个ListView控件的页面。任何时候都只能看到一个。我想使用单个DataPager,通过编程将DataPager的PagedControlID分配给可见ListView的ID。可能需要指出的是,DataPager包含在用户定义的用户控件(ASCX)中,它主要只是传递给DataPager 这个错误似乎很简单 [InvalidOperationException: No IPageableItemContainer wa

因此,我认为,我正在努力解决的更多是页面生命周期/视图状态问题。我有一个包含三个ListView控件的页面。任何时候都只能看到一个。我想使用单个DataPager,通过编程将DataPager的PagedControlID分配给可见ListView的ID。可能需要指出的是,DataPager包含在用户定义的用户控件(ASCX)中,它主要只是传递给DataPager

这个错误似乎很简单

[InvalidOperationException: No IPageableItemContainer was found. Verify that either the DataPager is inside an IPageableItemContainer or PagedControlID is set to the control ID of an IPageableItemContainer.]
System.Web.UI.WebControls.DataPager.LoadControlState(Object savedState) +628838
   System.Web.UI.Control.LoadControlStateInternal(Object savedStateObj) +137
   System.Web.UI.Page.LoadAllState() +342
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2533
以下是当前事件的顺序

  • 我有一个“摘要”页面,链接到显示ListView的“详细信息”页面

  • 当我单击“摘要”页面中的链接时,控制权将转移(而不是重定向)到“详细信息”页面,允许我通过page.PreviousPage属性将“摘要”页面的属性转发到“详细信息”页面

  • 在目标“详细信息”页面的OnInitComplete事件中,我将“PreviousPage”中的属性值分配给新“详细信息”页面中的属性

  • 这些“详细信息”页面属性只是读写到ViewState,因此在OnInitComplete事件中,通过为这些属性赋值,我希望这些值将在该页面上未来的回发之间持久化。这些属性之一是我希望DataPager绑定到的ListView的ID

    public String ActiveListID
    {
        get { return (String)ViewState["ActiveListID"]; }
        set { ViewState["ActiveListID"] = value; }
    }
    
  • 现在在OnPreLoad事件中,我将DataPager控件的PagedControlID属性设置为ViewState属性中存储的ListView的ID

  • 页面的初始加载将顺利进行

  • 当我尝试执行任何发回页面的操作时,就会出现问题。在OnInitComplete和OnPreLoad事件处理程序之间引发“InvalidOperationException”错误

  • 查看该错误,似乎没有正确设置寻呼机的PagedControlID属性。我不明白的是为什么

  • 寻呼机不应该记得以前设置的PagedControl ID吗?它不是存储在寻呼机自己的视图状态中吗

  • 如果不是,那么为什么它会在OnPreLoad之前抛出一个错误,在OnPreLoad之前,ViewState跟踪是打开的(这与Microsoft在OnLoad事件中设置错误的方式不一致)

  • 在OnInit事件中,我尝试在预加载事件之前设置PagedControlID,但遇到了一个问题,即最初加载页面时设置的ID在ViewState中不再存在,因此我得到了一个空值。我也不明白为什么ID没有保存到ViewState。根据MSDN,在OnInitComplete事件中设置它应该包括在跟踪的ViewState值中

  • 如果有人对此有任何想法,我将不胜感激

    谢谢,
    G

    基于堆栈跟踪,在加载视图状态之前调用的
    加载控制状态期间抛出
    InvalidOperationException
    。如果不以声明方式(在.ascx中)设置
    PagedControlID
    ,则在页面生命周期的这一点上,它仍然是一个空字符串

    MSDN库示例在一个重要方面不同于您的代码:
    DataPager
    正在动态构造、初始化并添加到页面中
    LoadControlState
    在将
    DataPager
    添加到页面之前不会被调用,此时已初始化
    PagedControlID


    ASP.NET团队似乎并不打算支持动态设置的
    PagedControlID
    属性。我想您唯一可以尝试的是模拟MSDN库示例并动态添加
    DataPager

    很抱歉响应太慢。。。我确实采纳了你的建议,虽然它对我并不完全有效,但它是正确的道路。我遇到的问题是DataPager控件是另一个UserControl的一部分,它以一种不允许我在正确的时间动态添加它的方式管理页面生命周期。考虑到您的建议,我将有机会重新编写此UserControl。再次感谢!
    public String ActiveListID
    {
        get { return (String)ViewState["ActiveListID"]; }
        set { ViewState["ActiveListID"] = value; }
    }