繁体   English   中英

用户控件丢失状态

[英]User control losing state

我有一个用户控件,我正在从apx页面中显式调用它。 在aspx页面的page_load中,我具有以下内容:

myControl = (DynamicTable)Page.LoadControl("../inc/DynamicTable.ascx");

然后在我希望它执行控制的代码中,我有以下内容:

pnlESDDEnrolled.Controls.Add(myControl);

我正在将pnlESDDEnrolled加载到其中的面板中以进行显示。

因此,我执行了aspx页面,它链接到用户控件,填充了该控件,返回到aspx页面,并在其中显示了该用户控件的页面。 一切都很好。

在用户控件上进行更新时出现问题。 请记住,其他数据也会在页面上更新,并且“更新”按钮位于页面上,而不是控件上。 无论如何,当按下更新按钮时,将在页面上触发button_click事件,但是我在用户控件上进行的更新会丢失。 由于页面加载了用户控件,然后用户控件执行了页面卸载方法,因此页面不再了解用户控件。 因此,当按下页面上的更新按钮时,我想我不太确定用户控件上的更新数据会发生什么。 我所知道的是它丢失了。 我已经为此工作了很长时间,非常感谢您的帮助

您还需要在用户控件中检查IsPostBack。

页面加载时,Page的Page_Load事件开始,然后UserControl的Page_Load将开始,执行,然后是其事件,然后控件返回到页面的Page_Load,然后是其所有事件。 当然,如果您在页面上使用Pre_Init或在控件中覆盖OnInit,则这些事件将在Page_Load之前执行。

因此,如果要在UserControl上动态创建项目,请检查IsPostBack并将这些事件放在UserControl中的OnInit重写函数中。 然后在页面的Page_Init中将对该用户控件的编程引用添加到该页面。

我猜想在您谈论用户控件状态时,这些是在代码中作为属性实现的吗?

如果是这样,则您可能将不得不使用Viewstate来保留UserControl的状态,以便在页面返回时,将首先使用先前呈现时的内容重新填充UserControl。 这就像更改任何公共状态属性以使用ViewState作为支持者一样简单。

我不是viewstate的忠实拥护者,但有时必须使用它。

但是,这里可能还有更多工作要做-正如您的直觉告诉您,此用户控件是动态加载的,这也可能是一个问题。

在这种情况下,这全都取决于您在页面生命周期的哪一部分进行。 您需要在渲染之前将此控件放入页面的树中(可能可以进行预渲染),因为此时页面出于保持状态的目的而“捕获”其控件集合。

尝试尽早在生命周期中将此控件插入页面结构中。 越早越好-因此Page_load就可以了。

同样-可能您已经在执行此操作-在这种情况下,我需要更多信息(也许是可重现的方案)来帮助修复它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM