以编程方式将PagedControlID分配给DataPAger

时间:2013-01-12 01:10:47

标签: asp.net viewstate page-lifecycle datapager

所以我正在努力,我相信,更多的是Page Lifecycle / ViewState问题。我有一个托管三个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

这是当前的事件序列。

  1. 我有一个“SUMMARY”页面,它链接到显示ListView的“Detail”页面。

  2. 当我点击“SUMMARY”页面中的链接时,控件被TRANSFERRED(未重定向)到“DETAIL”页面,允许我通过Page.PreviousPage向前传递“SUMMARY”页面的属性。属性到“详细信息”页面。

  3. 在目标“DETAIL”页面的OnInitComplete事件中,我将“PreviousPage”中的属性值分配给新“DETAIL”页面中的属性。

    protected override void OnInitComplete(EventArgs e)
    {
        IExceptionPage previousPage = (PreviousPage != null) ? ((IExceptionPage)PreviousPage) : null;
        if (previousPage != null)
        {
            this.ActiveListID       = previousPage.ActiveListID;
            this.ActionType         = previousPage.ActionType;
            this.CategoryTheme      = previousPage.CategoryTheme;
            this.ExceptionCode      = previousPage.ExceptionCode;
        }
    }
    
  4. 这些“DETAIL”页面属性只是简单地读取和写入ViewState,因此通过为这些属性赋值,在OnInitComplete事件中,我希望这些值将在此页面上的未来回发之间保持不变。其中一个属性是我希望DataPager绑定到的ListView的ID。

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

  6. 页面的初始加载没有问题。

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

  8. 查看错误,看起来没有正确设置寻呼机的PagedControlID属性。我不明白的是为什么。

    1. 寻呼机不应该记得之前设置的PagedControlID吗?是不是存储在Pagers自己的ViewState中?

    2. 如果没有,那么为什么在OnPreLoad之前抛出一个错误,其中ViewState跟踪被打开(这与他们在OnLoad事件中设置的Microsoft MSDN Example不一致)?

    3. 我试图在OnInit事件中在PreLoad事件之前设置PagedControlID,但我遇到的问题是,我在ViewState中不再存在最初加载页面时设置的ID,因此我得到一个NULL值。我也不明白为什么ID 被保存到ViewState。根据MSDN documentation I am referencing,在OnInitComplete事件中设置它应该将其包含在跟踪的ViewState值中。

    4. 如果有人对此有任何想法,我将非常感激。

      谢谢, ģ

1 个答案:

答案 0 :(得分:1)

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

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

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