LoadViewState не запущен на моем пользовательском элементе управления
У меня есть пользовательский элемент управления, вложенный в повторитель. Внутри моего пользовательского контроля у меня есть еще один повторитель, и в этом у меня есть панель.
Я пытаюсь переопределить событие LoadViewState моего пользовательского элемента управления и динамически добавить элементы управления на панель. Я хочу сделать это в LoadViewState, чтобы динамические элементы управления добавлялись до загрузки viewstate, чтобы они сохраняли свои значения после обратной передачи.
По какой-то причине событие LoadViewState в пользовательском элементе управления (ascx) не запускается. Есть ли какой-то способ заставить его выстрелить, или есть другой способ, которым я мог бы воспользоваться? Я исключил событие привязки данных повторителя пользовательских элементов управления, потому что оно мне нужно, чтобы оно работало, даже если привязка данных не происходит, и я не могу сделать это для события создания элемента повторителя, потому что дочерняя панель и внутренний html не существуют еще.
2 ответа
LoadViewState
не подходит для добавления дочерних элементов управления. Для динамического добавления элементов управления в пользовательский элемент управления вам нужно обратиться к методу CreateChildControls.
Это не стрельба LoadViewState
событие, потому что вам нужно сохранить хотя бы одно значение в ViewState
устроить событие
Я думаю, что у меня была похожая проблема с некоторыми динамически создаваемыми дочерними пользовательскими элементами управления. 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; }
}