LoadViewState未在我的用户控件上触发

时间:2010-03-19 15:31:37

标签: asp.net user-controls viewstate loadviewstate

我有一个嵌套在转发器中的用户控件。 在我的用户控制中,我有另一个中继器,我有一个面板。

我试图覆盖用户控件的LoadViewState事件并动态地向面板添加控件。我想在LoadViewState中执行它,以便在viewstate加载之前添加动态控件,因此它们在回发后保留其值。

由于某种原因,用户控件(ascx)上的LoadViewState事件未触发。有没有办法强迫它开火,还是有其他方法我可以使用?我已经排除了用户控制转发器数据绑定事件,因为我需要它才能工作,即使数据绑定没有发生,我不能在转发器项目创建的事件上做,因为子面板和内部html不存在爱好。

2 个答案:

答案 0 :(得分:7)

LoadViewState不适合添加子控件。要在用户控件中动态添加控件,您需要查看CreateChildControls方法。

它没有触发LoadViewState事件,因为您需要在ViewState中保存至少一个值才能触发事件。

答案 1 :(得分:0)

我认为我对一些动态创建的子用户控件有类似的问题。即使我在首先创建ViewState时能够访问其ViewState,{@ 1}}也没有在回发中调用。 LoadViewState似乎也被正确地称为SaveViewState。结果是,在完全初始化之前,子页面ViewState在页面Init事件中并不真正可用(没有这导致异常),并且只有在将控件添加到父级时才会发生这种情况。在确保了这一点之后,孩子ViewState被正确地保留在回发中。

    // Belongs to a Page. If you create the children control in the
    // Load event in you can also access the page ViewState
    protected void Page_Init(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            for (int it = 0; it < 5; it++)
            {
                ChildControl child = LoadControl("ChildControl.ascx")
                    as ChildControl;
                child.ParentPage = this;
                TabPanel tab = tabContainer.FindControl("TabPanel" + it)
                    as TabPanel;
                // Ensure to add the child control to its parent before
                // accessing its ViewState!
                tab.Controls.Add(child);     // <---
                string caption = "Ciao" + it;
                child.Caption = caption;     // Here we access the ViewState
                tab.HeaderText = caption;
                tab.Visible = true;
                _Children.Add(child);
            }
        }
        [...]
    }

    // Belongs to ChildControl 
    public string Caption
    {
        get { return ViewState["Caption"] as string; }
        internal set { this.ViewState["Caption"] = value; }
    }