【发布时间】:2015-01-26 13:08:37
【问题描述】:
我有一个带有更新面板的网页。 在更新面板中,我有一个带有这样的用户控件的面板:
<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中就足够了。 -
但是面板是硬编码的,我向它添加了控件,所以它不应该有自己的视图状态,他将添加到它的控件存储在其中吗?我可以尝试管理自己的视图状态,但如果面板已经拥有自己的视图状态,这似乎是不对的。没有?
-
控件的视图状态不用于持久化动态控件。它只是用来存储 f.e.
TextBox的Text属性(如果它没有默认值)。