【问题标题】:Fail to continously add new control into Panel/Placeholder during partial postback在部分回发期间未能将新控件连续添加到面板/占位符中
【发布时间】:2013-09-01 23:45:48
【问题描述】:

我想创建一个动态表单,用户有一个按钮可以点击它。 当按钮被点击时,它会触发部分回发并在占位符中添加一个新控件。

我的问题是,当第一次单击按钮时,它能够在占位符中创建一个新控件。但即使我点击了几次按钮,它也不会创建更多。

<asp:ScriptManager ID="ScriptManager1" EnablePartialRendering="true" runat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:Button ID="Button1" runat="server" Text="Add images" OnClick="Button1_Click" />
                <asp:HiddenField ID="HiddenField1" runat="server" Value="1" />
                <br />
                <asp:Panel ID="PlaceHolder1" runat="server">
                    <asp:FileUpload ID="FileUpload1" runat="server" />
                </asp:Panel>
            </ContentTemplate>
        </asp:UpdatePanel>

后面的代码:

protected void Button1_Click(object sender, EventArgs e)
    {

        PlaceHolder1.Controls.Add(new FileUpload());

    }

【问题讨论】:

  • 能分享一下aspx和后面的代码吗

标签: c# asp.net


【解决方案1】:

除非在 preinit 或 init 阶段添加动态添加的控件,否则它不会在回发之后持续存在。因此,当第二次单击按钮时,第一次添加的控件丢失,然后按钮逻辑再次添加控件,每次都留下一个控件。对于在 init 阶段之后添加的控件,您需要存储其状态并在每次回发时重新创建它。本文对此进行了描述:

http://www.codeproject.com/Articles/3684/Retaining-State-for-Dynamically-Created-Controls-i

您也可以在不使用动态添加的控件的情况下实现您的目标。一种可能的方法是使用 ListView 控件,将 FileUpload 控件添加到其 ItemTemplate 并在每次单击按钮时将新记录添加到列表视图数据源。

【讨论】:

  • 您能否详细解释一下动态添加控件的视图状态?我已经阅读了几篇关于此的文章,但我仍然无法全面了解。
  • 阅读我链接到的文章。它解释了问题并给出了解决方案。
  • 如果我使用listview.InsertItemTemplate,会不会和我之前做的一样,新插入的item的viewstate?
猜你喜欢
  • 2011-01-05
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 2011-11-19
  • 2013-08-07
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多