Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# asp.net面板在回发时丢失viewstate_C#_Asp.net - Fatal编程技术网

C# asp.net面板在回发时丢失viewstate

C# asp.net面板在回发时丢失viewstate,c#,asp.net,C#,Asp.net,我有一个网页,里面有一个更新面板。 在“更新”面板中,我有一个带有如下用户控件的面板: <asp:UpdatePanel ID="updatePanel" runat="server" ChildrenAsTriggers="true" UpdateMode="Conditional"> <ContentTemplate> <asp:Panel ID="pnlFiles" runat="server" EnableViewState="true">

我有一个网页,里面有一个更新面板。 在“更新”面板中,我有一个带有如下用户控件的面板:

<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 files = (FilesControl)LoadControl("~/UserControls/FilesControl.ascx");
files.ID = XXX;
pnlFiles.Controls.Add(files); 
但在每次回发(选中每个复选框)时,面板将丢失最后一个状态,添加的控件将被删除,因此面板实际上每次都会返回其初始状态,我无法向其添加越来越多的控件。 我启用了视图状态,但没有帮助。
我在这里遗漏了什么?

根据要求,我的评论作为答案:

您需要在
page\u Init
page\u Load
(最迟)中的每次回发时使用与以前相同的ID将控件添加到页面


ID是唯一的,我生成它。我在复选框中添加控件 已检查更改事件chkCompare\u CheckedChanged


虽然可以在事件中动态添加控件,但有必要在后续回发中重新创建此控件。这必须最迟在
Page\u Load
中完成(最好是
Page\u Init
)。因此,您需要将已添加的控件存储在某个位置,以便能够重新创建它们。也许将控件计数存储在
ViewState
中就足够了

因此,我应该将添加的控件存储在ViewState对象中,然后 然后将它们重新添加到页面上的面板上

不,您不应该将控件存储在
ViewState
中,而是存储重新创建控件所需的信息。您如何知道需要添加哪些内容?当然,您也可以使用webdatabound控件,如
Repeater
DataList
GridView
,其中您只需要分配
数据源
,并且会自动为您执行持久化操作


这就是对所有控件所做的,即使您以声明方式添加它们(在aspx上)。但是这些控件是由ASP.NET自动重新创建的。由于客户端和服务器之间的通信是无状态且断开连接的,因此所有变量都在页面的末尾处理。

是否在
page\u Init
page\u Load
中的每次回发中使用与以前相同的ID向页面添加控件?ID是唯一的,我生成它。我在复选框checked change event
chkCompare\u checked changed
上添加控件虽然可以在事件中动态添加控件,但有必要在后续回发中重新创建此控件。这必须最迟在
Page\u Load
中完成(最好是
Page\u Init
)。因此,您需要将已添加的控件存储在某个位置,以便能够重新创建它们。也许将控件计数存储在
视图状态
中就足够了。但是面板是硬编码的,我向它添加了控件,所以它不一定有自己的视图状态,他将添加到其中的控件存储在其中吗?我可以尝试管理自己的视图状态,但如果面板已经有自己的视图状态,则似乎不正确。否?控件的viewstate不用于持久化动态控件。如果
文本框
没有默认值,它只用于存储
文本
属性的f.e