我有一个带有更新面板的网页。在更新面板中,我有一个带有如下用户控件的面板:
<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);
但是在每次回发(选中每个复选框)时,面板都会丢失最后一个状态,并且添加的控件会被清除,因此面板实际上每次都返回到其初始状态,我无法向其添加越来越多的控件。我启用了视图状态,但它没有帮助。我在这里错过了什么?
根据要求,我的评论作为答案:
您需要在Page_Init
或Page_Load
(最迟)的每个回发中使用与以前相同的 ID 将控件添加到页面。
ID是唯一的,我生成它。我在复选框上添加控件 选中更改事件chkCompare_CheckedChanged
虽然在事件中动态添加控件是完全可以的,但有必要在后续回发时重新创建此控件。这最迟必须在Page_Load
完成(更好:Page_Init
)。因此,您需要将已添加的控件存储在某个位置,以便能够重新创建它们。也许将控制计数存储在ViewState
中就足够了。
所以我应该将我添加的控件存储在 ViewState 对象中,并且 然后将它们重新添加到Page_Load ?
不可以,不应将控件存储在ViewState
中,而应将重新创建控件所需的信息存储在控件中。您如何知道需要添加什么?当然,您也可以使用Webdatabound控件,例如Repeater
,DataList
或GridView
,您只需要分配一个DataSource
,并且持久化的内容会自动为您完成。
这就是对所有控件执行的操作,即使您以声明方式添加它们(在 aspx 上)。但这些控件是由 ASP.NET 自动重新创建的。所有变量都在页面生命周期结束时释放,因为客户端和服务器之间的通信是无状态且断开连接的。