持续动态ReadOnly字段过去初始化

时间:2015-09-13 10:15:20

标签: asp.net vb.net dynamic viewstate

我在页面加载/ init上动态创建一个只读文本框,在第一次加载(不是IsPostBack)时我设置了文本。我还在页面上有一个按钮,其中包含一个更改文本框内容的单击事件。使用另一个按钮,我阅读文本框的文本。问题如下:

  1. 如果我点击更改文本框的按钮,然后点击阅读文本框文本的按钮,就可以了。

  2. 如果我只是加载页面并单击读取文本框文本的按钮,则会返回一个空字符串

  3. 我需要两种方案来恢复结果 - 无论是原始文本还是新的以编程方式更改的文本。

    示例代码:

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim Textbox As New TextBox()
        Textbox.ID = "Bob"
        Textbox.ReadOnly = True
        If Not IsPostBack Then
            Textbox.Text = "Initial Text"
        End If
        Content.Controls.Add(Textbox)
    
        Dim Button As New Button()
        Button.Text = "Change text"
        AddHandler Button.Click, AddressOf Button_Click
        Content.Controls.Add(Button)
    End Sub
    
    Protected Sub Button_Click(ByVal sender As Object, ByVal e As EventArgs)
        'FindControlRecursive is locally defined - just finds a control based on root control and ID
        CType(FindControlRecursive(Content, "Bob"), TextBox).Text = "Hmmmmm"
    End Sub
    
    Private Sub Submit_Click(sender As Object, e As EventArgs) Handles Submit.Click
        Dim Textbox As TextBox = CType(FindControlRecursive(Content, "Bob"), TextBox)
        MsgBox(Textbox.Text)
    End Sub
    

    我每次都可以重新初始化文本框,但这只是一个例子,在实践中我将从SQL中提取它,如果我在页面上有几个只读控件,我宁愿让控件保持其文本而不是每次都回到SQL。

1 个答案:

答案 0 :(得分:0)

我找到了两种方法来解决这个问题,第二种是更受欢迎的方法(取决于具体情况):

  1. 专门将初始文本添加到viewstate,然后使用viewstate中的值在每个回发上设置文本:

    If Not IsPostBack Then
        Textbox.Text = "Initial Text"
        ViewState("Bob") = Textbox.Text
    Else
        Textbox.Text = ViewState("Bob")
    End If   
    
  2. 将PreRender事件添加到文本框中,该文本框仅将文本设置为自身。这是在ViewState开始被跟踪之后发生的,因此它通过控件添加到视图状态,并在回发中保持不变:

    If Not IsPostBack Then
        Textbox.Text = "Initial Text"
        AddHandler Textbox.PreRender, AddressOf PersistPastInitialLoad
    End If
    

    并添加新子:

    Protected Sub PersistPastInitialLoad(ByVal sender As Object, ByVal e As EventArgs)
        'This is just for example - would need refining for different types of controls
        CType(sender, TextBox).Text = CType(sender, TextBox).Text
    End Sub
    
  3. 基本上它们都做同样的事情 - 在viewstate中保存文本 - 但它取决于最好使用的实现。第一个实现可能更容易阅读/使用,但如果您单击按钮更改文本框文本,则会导致冗余的视图状态膨胀(即,您将在viewstate中创建初始文本,而不是您创建的视图状态键)当控制onchange将当前文本添加到viewstate时。