3

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

我正在尝试覆盖我的用户控件的 LoadViewState 事件并将控件动态添加到面板。我想在 LoadViewState 中执行此操作,以便在加载视图状态之前添加动态控件,以便它们在回发后保留其值。

由于某种原因,用户控件 (ascx) 上的 LoadViewState 事件未触发。有什么方法可以强制它开火,还是我可以使用另一种方法?我已经排除了用户控件转发器数据绑定事件,因为即使没有发生数据绑定,我也需要它工作,而且我也无法在转发器项目创建事件上执行此操作,因为子面板和内部 html 不存在然而。

4

2 回答 2

7

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

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

于 2010-03-19T15:40:12.420 回答
0

我想我对一些动态创建的子用户控件有类似的问题。LoadViewState即使我在第一次创建它们时能够访问它们的 ViewState,也不会在回发中调用它们。SaveViewState似乎也被正确调用。Init在完全初始化之前,子 ViewState 在页面事件中并不是真正可用的(不会导致异常) ,这仅在控件添加到父级时才会发生。在确保这一点之后,子 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; }
    }
于 2014-04-17T21:01:47.630 回答