我有一个带有更新面板的网页。在更新面板中,我有一个面板,其中有一个用户控件,如下所示:
<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); 但是在每次回发(选中的每个复选框)中,面板都会丢失最后一个状态,并且添加的控件会被删除,因此面板实际上每次都返回到它的初始状态,而我无法在其上添加越来越多的控件。我启用了视图状态,但没有帮助。我在这里错过了什么?
发布于 2015-01-26 14:01:29
应要求,我的意见作为答复:
您需要将控件添加到Page_Init或Page_Load中每次回发的页面中(最晚),ID与前面相同。
ID是唯一的,我生成它。我在复选框中添加控件,选中了change事件chkCompare_CheckedChanged。
虽然在事件中动态添加控件是非常好的,但是在随后的回发中必须使用re-create这个控件。这必须最迟在Page_Load中完成(更好的是:Page_Init)。因此,您需要存储您已经添加的控件的某个位置,以便能够重新创建它们。也许将控件计数存储在ViewState中就足够了。
因此,我应该将添加到ViewState对象中的控件存储起来,然后将它们重新添加到Page_Load上的面板中?
不,您不应该将控件存储在ViewState中,而应该存储重新创建它们所需的信息。你怎么知道你需要加什么?当然,您也可以使用for数据库控件,如Repeater、DataList或GridView,您只需要分配一个DataSource,持久化操作就会自动为您完成。
这就是对所有控件所做的,即使您以声明的方式添加它们(在aspx上)。但是这些控件是由ASP.NET自动重新创建的,由于客户端和服务器之间的通信是无状态和断开连接的,所以所有变量都会在页面的生命周期结束时被处理。
https://stackoverflow.com/questions/28150690
复制相似问题