用户控制丢失状态

时间:2010-06-27 00:44:50

标签: c# asp.net

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

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

然后在我希望它执行控件的代码中,我有:

pnlESDDEnrolled.Controls.Add(myControl);

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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

我不是观众的忠实粉丝,但有时候必须使用它。

然而,这里可能还有更多工作 - 正如你的直觉告诉你的那样,这个用户控件是动态加载的,这也可能是一个问题。

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

尝试在生命周期中尽早将此控件的插入移动到页面结构中。越早越好 - 所以Page_load会好的。

同样 - 可能你已经在做这个 - 在这种情况下我需要更多的信息(可能是一个可重现的场景)以帮助修复它。