我有一个嵌套在转发器中的用户控件。 在我的用户控制中,我有另一个中继器,我有一个面板。
我试图覆盖用户控件的LoadViewState事件并动态地向面板添加控件。我想在LoadViewState中执行它,以便在viewstate加载之前添加动态控件,因此它们在回发后保留其值。
由于某种原因,用户控件(ascx)上的LoadViewState事件未触发。有没有办法强迫它开火,还是有其他方法我可以使用?我已经排除了用户控制转发器数据绑定事件,因为我需要它才能工作,即使数据绑定没有发生,我不能在转发器项目创建的事件上做,因为子面板和内部html不存在爱好。
答案 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; }
}