我在页面加载/ init上动态创建一个只读文本框,在第一次加载(不是IsPostBack)时我设置了文本。我还在页面上有一个按钮,其中包含一个更改文本框内容的单击事件。使用另一个按钮,我阅读文本框的文本。问题如下:
如果我点击更改文本框的按钮,然后点击阅读文本框文本的按钮,就可以了。
如果我只是加载页面并单击读取文本框文本的按钮,则会返回一个空字符串
我需要两种方案来恢复结果 - 无论是原始文本还是新的以编程方式更改的文本。
示例代码:
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。
答案 0 :(得分:0)
我找到了两种方法来解决这个问题,第二种是更受欢迎的方法(取决于具体情况):
专门将初始文本添加到viewstate,然后使用viewstate中的值在每个回发上设置文本:
If Not IsPostBack Then
Textbox.Text = "Initial Text"
ViewState("Bob") = Textbox.Text
Else
Textbox.Text = ViewState("Bob")
End If
将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
基本上它们都做同样的事情 - 在viewstate中保存文本 - 但它取决于最好使用的实现。第一个实现可能更容易阅读/使用,但如果您单击按钮更改文本框文本,则会导致冗余的视图状态膨胀(即,您将在viewstate中创建初始文本,而不是您创建的视图状态键)当控制onchange将当前文本添加到viewstate时。