我有一个带有更新面板的网页。 在更新面板中,我有一个带有用户控件的面板,如下所示:
<asp:UpdatePanel ID="updatePanel" runat="server" ChildrenAsTriggers="true" UpdateMode="Conditional">
<ContentTemplate>
<asp:Panel ID="pnlFiles" runat="server" EnableViewState="true">
<files:FilesControl runat="server" ID="filesControl" />
</asp:Panel>
</ContentTemplate>
我有一个复选框列表,每当用户选中其中一个时,我想在该面板中添加另一个FilesControl
所以我这样做:
FilesControl files = (FilesControl)LoadControl("~/UserControls/FilesControl.ascx");
files.ID = XXX;
pnlFiles.Controls.Add(files);
但是在每次回发(选中每个复选框)时,面板都会丢失最后一个状态,并且添加的控件将被清除,因此面板实际上每次都会返回其初始状态,而我无法对其进行越来越多的控制它。 我启用了视图状态,但它没有帮助。 我在这里错过了什么?
答案 0 :(得分:2)
根据要求,我的评论作为答案:
您需要在Page_Init
或Page_Load
(最晚)的每个回发中将控件添加到页面中,并使用与之前相同的ID。
ID是唯一的,我生成它。我在复选框上添加了控件 检查更改事件chkCompare_CheckedChanged
虽然在事件中动态添加控件是完全正常的,但有必要重新 - 在后续回发中创建此控件。这必须最迟在Page_Load
完成(更好:Page_Init
)。因此,您需要存储已添加的控件,以便能够重新创建它们。也许只需将控制计数存储在ViewState
。
所以我应该存储我在ViewState对象中添加的控件 然后将它们重新添加到Page_Load?
上的面板中
不,您不应将控件存储在ViewState
中,而应存储重新创建它们所需的信息。你怎么知道你需要添加什么?当然,你也可以使用像Repeater
,DataList
或GridView
这样的webdatabound控件,你只需要指定一个DataSource
,就可以自动完成持久化的东西。< / p>
即使你以声明的方式添加它们(在aspx上),这就是所有控件的功能。但是这些控件是由ASP.NET自动重新创建的。所有变量都放在页面life-cycle的末尾,因为客户端和服务器之间的通信是无状态的并且是断开连接的。