以编程方式创建的ASP.NET TextBox在PostBack之后保留Text值,即使清除了Control也是如此

时间:2011-01-21 00:50:03

标签: asp.net vb.net controls textbox postback

我有一个下拉菜单,根据选择的项目,我调用一个Web服务,然后动态创建一些文本框。

我第一次下拉菜单并选择一个项目,它完美地工作,文本框被动态创建和填充。但是,下次我下拉菜单(在第一次回发后),并选择不同的东西......在第二次回发后,原始值保留在文本框中。

我正在清除占位符中的所有文本框,然后重新创建它们,然后设置一个新值,它们如何保留OLD值...特别是如果我控制它们。从页面中清除它们?

注意:第二次创建它们时,文本框ID最终会相同。这可能与它有关吗?需要支持此重复ID功能。

我的代码,从Page_Load调用,如下:(编辑以添加更多代码)

Private Sub RefreshEntity()

        Dim XmlRecords As New XmlDocument
        Dim XmlRecordsNode As XmlNode
        Dim EntityType As String = EntityTypes.SelectedValue
        Dim Entity As String = RecordValue.Value
        Dim FieldName As String
        Dim FieldValue As String

        FieldPlaceHolder.Controls.Clear()

        If RecordList.SelectedValue <> "Select..." Then
            Try
                XmlRecordsNode = LoginInfo.SharePointConnectWebService.GetMetaData(LoginInfo.WSUser, LoginInfo.WSPass, _
                                                                                  EntityType, Entity)
                XmlRecords.LoadXml(XmlRecordsNode.OuterXml)
            Catch ex As Exception
                ConfirmLabel.Text = "<b>Error:</b><br>" & ex.Message.ToString
                Return
            End Try
        Else
            SetProperties.Visible = False
            Return
        End If

        For Each OneNode As XmlNode In XmlRecords.SelectNodes("Fields").Item(0).ChildNodes

            FieldName = OneNode.Name
            FieldValue = OneNode.InnerText

            Dim newLabel As Label = New Label()
            newLabel.Text = FieldName & ":   "

            Dim newTextBox As TextBox = New TextBox()
            newTextBox.ID = "Field-" & FieldName
            newTextBox.Text = FieldValue

            Dim newLine As Label = New Label()
            newLine.Text = "<br><br>"

            FieldPlaceHolder.Controls.Add(newLabel)
            FieldPlaceHolder.Controls.Add(newTextBox)
            FieldPlaceHolder.Controls.Add(newLine)

        Next

        SetProperties.Visible = True

    End Sub

RecordValue.Value是一个隐藏的字段,在每个Page_Load中填充:

                RecordValue.Value = RecordList.SelectedValue

RecordList是我的DropDown菜单。

2 个答案:

答案 0 :(得分:0)

这可能是由于ViewState或者发布的值会破坏您的值。

一旦控件动态添加到控件集合中,它就需要赶上已经触发的所有页面生命周期事件。在回发的情况下,这意味着ViewState和/或发布的表单值将根据您将动态控件添加到控件集合并设置.text属性的顺序来破坏TextBox上的.text属性。

要解决此问题,您可以通过在动态生成控件上将.EnableViewState属性设置为false来禁用ViewState,也可以在对控件集合设置任何属性之前将控件添加到控件集合中。

For Each OneNode As XmlNode In XmlRecords.SelectNodes("Fields").Item(0).ChildNodes

    FieldName = OneNode.Name
    FieldValue = OneNode.InnerText

    Dim newLabel As Label = New Label()
    Dim newTextBox As TextBox = New TextBox()
    Dim newLine As Label = New Label()

    newTextBox.ID = "Field-" & FieldName

    newLabel.EnableViewState = False
    newTextBox.EnableViewState = False
    newLine.EnableViewState = False

    FieldPlaceHolder.Controls.Add(newLabel)
    FieldPlaceHolder.Controls.Add(newTextBox)
    FieldPlaceHolder.Controls.Add(newLine)

    newLabel.Text = FieldName & ":   "
    newTextBox.Text = FieldValue
    newLine.Text = "<br><br>"

Next

答案 1 :(得分:-1)

您是不是将值存储在Session变量中,然后将其放回代码中的文本框中?