LoadViewState не запущен на моем пользовательском элементе управления - PullRequest
3 голосов
/ 19 марта 2010

У меня есть пользовательский элемент управления, вложенный в ретранслятор. Внутри моего пользовательского контроля у меня есть еще один повторитель, и в этом у меня есть панель.

Я пытаюсь переопределить событие LoadViewState моего пользовательского элемента управления и динамически добавить элементы управления на панель. Я хочу сделать это в LoadViewState, чтобы динамические элементы управления добавлялись до загрузки viewstate, чтобы они сохраняли свои значения после обратной передачи.

По какой-то причине событие LoadViewState в пользовательском элементе управления (ascx) не запускается. Есть ли какой-нибудь способ заставить его выстрелить, или есть другой способ, которым я мог бы воспользоваться? Я исключил событие привязки данных повторителя пользовательских элементов управления, потому что оно мне нужно, чтобы оно работало, даже если привязка данных не происходит, и я не могу сделать это для события создания элемента повторителя, потому что дочерняя панель и внутренний html не существуют еще.

Ответы [ 2 ]

7 голосов
/ 19 марта 2010

LoadViewState не подходит для добавления дочерних элементов управления. Для динамического добавления элементов управления в пользовательский элемент управления вам нужно обратиться к методу CreateChildControls .

Это не запуск события LoadViewState, потому что вам нужно сохранить хотя бы одно значение в ViewState, чтобы вызвать событие.

0 голосов
/ 18 апреля 2014

Я думаю, что у меня была похожая проблема с некоторыми динамически создаваемыми дочерними пользовательскими элементами управления.LoadViewState не вызывался в постбэках, даже если я смог получить доступ к их ViewState при первом их создании.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; }
    }
...