2009-11-20 153 views
2

我试图建立一个表单,因为它使用时会生成自己。我创建了一个非常简单的例子,与我下面试图做的事情松散地相关,但是它证明了这个问题。ASP.NET表单元素的动态创建

用户在文本框中键入一个单词,单击该按钮,并将一个新的文本框加载到面板中,并使用用户输入的原始文本框中的值。然后,用户应该能够输入其他内容,并通过点击按钮创建另一个文本框,基本上允许0,1,...,n文本框出现在窗体上的“txtFeeder”文本框上方。

问题是,每次单击按钮时,它都不会添加新控件,它似乎只是更新已使用新(增量)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

在PostBack上,您需要明确地重新生成ViewState中的按钮(您检查在视图状态下添加的计数器并重新生成添加的按钮) - 否则它们将消失(只有原始的那个会出现,正在体验)。

看看this question,这个人试图实现smt非常类似于你正在寻找(保持一堆动态按钮,并在回发中重新生成它们)。

+0

谢谢 - 链接也是一个很好的帮助。 – Chris

2

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