动态创建ASP.NET表单元素

时间:2009-11-20 17:05:45

标签: asp.net vb.net web-applications dynamic webforms

我正在尝试构建一个在使用时自行生成的表单。我创建了一个非常简单的例子,与我在下面尝试做的事情松散相关,但它证明了这个问题。

用户在文本框中键入单词,单击Button并将新TextBox加载到Panel中,其中包含用户输入的原始TextBox中的值。然后,用户应该能够键入其他/相同的内容并通过单击按钮创建另一个文本框,基本上允许在表单上的“txtFeeder”TextBox上方出现0,1,..,n个文本框。

问题在于,每次单击按钮时,它都不会添加新控件,它似乎只是更新已使用新(增量)ID创建的控件。我不确定我做错了什么,或者我想做什么都做不到(我觉得很难相信)?

这是.aspx ......

<form id="frmMain" runat="server">
    <asp:Panel ID="pnlAdded" runat="server"></asp:Panel>
    <asp:TextBox ID="txtFeeder" runat="server"></asp:TextBox>
    <asp:Button ID="btnFeedPanel" runat="server" Text="Button" />
</form>

......这是.aspx.vb ......

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
        ViewState.Add("elementCount", 0)
    End If
End Sub
Protected Sub btnFeedPanel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnFeedPanel.Click
    ViewState("elementCount") += 1
    Dim txtNew = New TextBox
    txtNew.ID = "txtElement" & ViewState("elementCount")
    txtNew.Text = txtFeeder.Text
    pnlAdded.Controls.Add(txtNew)
    txtNew = Nothing
End Sub

由于

2 个答案:

答案 0 :(得分:2)

动态添加到页面的控件不会自动保留在表单帖子之间。控件本身不会保留在页面的视图状态中。我认为每次发生回发时你都需要重建所有以前添加的字段。

答案 1 :(得分:2)

在PostBack上你需要从ViewState显式重新生成按钮(你检查你在视图状态中添加的计数器并重新生成添加的按钮) - 否则它们将会消失(只有原始的会出现,因为你'重新体验)。

看看this question,那个人正试图实现与你正在寻找的非常相似的smt(维护一堆动态按钮并在回发时重新生成它们)。