我在后面的代码中以编程方式向页面添加控件。我添加一个asp:Label并设置它的Text值。我添加一个asp:TextBox并设置它的Text值。两个Text值都在Response中返回并显示在浏览器中。到目前为止一切都很好。
用户执行导致回发的操作。我重新加载动态添加的asp:Label和asp:TextBox。将Response返回给浏览器时,仅显示asp:TextBox Text值。 asp:Label Text值不是。
如果我检查HTML,我可以看到asp:Label控件(呈现为HTML span标签),但没有值。
如何让代码在每次回发时自动重新加载asp:Label的Text值?为什么asp:Label和asp:TextBox的行为不同?我不想在每次回发时手动重新设置Text值。
以下是一些类似于我正在做的代码(placeHolderNameplates是asp:aspx页面上的asp:PlaceHolder控件):
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
If Not Page.IsPostBack Then
Dim lbl As Label = New Label()
lbl.ID = "xxx1"
lbl.Text = "yo"
placeHolderNameplates.Controls.Add(lbl)
Dim tb As TextBox = New TextBox
tb.ID = "xxx2"
tb.Text = "yoyo"
placeHolderNameplates.Controls.Add(tb)
Else
Dim lbl As Label = New Label()
lbl.ID = "xxx1"
placeHolderNameplates.Controls.Add(lbl)
Dim tb As TextBox = New TextBox
tb.ID = "xxx2"
placeHolderNameplates.Controls.Add(tb)
End If
答案 0 :(得分:4)
您需要做的是在设置值之前将控件添加到占位符,因此它应该是
Dim lbl As Label = New Label()
placeHolderNameplates.Controls.Add(lbl)
lbl.ID = "xxx1"
lbl.Text = "yo"
有关详细信息,请参阅这些帖子: http://www.yakkowarner.com/2008/01/aspnet-dynamic-controls-and-viewstate.html http://codebetter.com/jefferypalermo/2004/11/25/key-to-ensuring-dynamic-asp-net-controls-save-viewstate-level-300/
在将它们添加到页面之前,它们尚未初始化。当动态控件添加到另一个控件时,新控件会进行追赶以进入父控件所在的阶段。例如,如果在Page_Load中添加了一个文本框,它将会追赶并开始通过其Init和Load阶段。这很重要,因为它将开始跟踪其视图状态。在跟踪viewstate之前添加的值将不会使其成为viewstate并且将在PostBack上丢失。
答案 1 :(得分:0)
似乎动态创建的控件不会自动添加到ViewState。 TextBox控件保留了它的值,但是因为它被渲染到<input type="text" value="xyz" />
html元素的性质。
看一下这篇文章:
http://www.codeproject.com/Articles/3684/Retaining-State-for-Dynamically-Created-Controls-i
答案 2 :(得分:0)
嘿,请查看本网站MSDN
您必须使用以下事件添加控件(以便viewstate自动维护)
override protected void OnInit(EventArgs e)