我有一个非常简单的用户控件,基本上是一个文本框和一个标签,其目的是在彼此之间切换。控件在页面Page_Load event
期间绑定。在UserControl的Page_Load
事件中,我调用Toggle()函数,该函数显示或隐藏适当的控件,并分别根据布尔可编辑属性和字符串Text属性设置其文本。
这是我的Toggle()方法(记住Editable和Text是公共属性):
Public Sub Toggle()
If Editable Then
txtText.Visible = True
lblText.Visible = False
txtText.Text = Text
txtText.CssClass = TextboxCSSClass
Else
txtText.Visible = False
lblText.Visible = True
lblText.Text = Text
lblText.CssClass = LabelCSSClass
End If
End Sub
我的问题也很简单:当页面上的按钮调用控件的Toggle()方法时,切换工作正常,但文本消失了!我试过这个旁边有一个普通的未绑定文本框,文本框保持其文本值就好了。有什么我想念的吗?
提前感谢您的帮助。
答案 0 :(得分:0)
当您将控件的visible属性设置为False时,它将不会在Html中呈现,因此它不能在页面之间传送状态。而是考虑使用MultiView控件
答案 1 :(得分:0)
更新:有关评论的更多信息。
如果禁用了视图状态,并设置了文本框的文本,则文本是输入控件中的文本。当您尝试了解给定文本框的值是否发生更改时,这会在不常见的情况下影响您。
以上标签不同,因为它不是输入控件。禁用视图状态后,如果未在每个请求上设置文本,它将显示初始值(试用)。视图状态是自动允许保持信息在回发中的控件。
正如标签所发生的那样,它发生在用户控件上。如果更改setter使其直接设置两个控件文本,则在使用viewstate时它将保留内部控件中的值。如果将其关闭,标签的行为将与文本框的行为不同。
另请注意,关闭视图状态也会影响Visible配置。我关闭了视图状态,但你可能有一个场景,你真的希望保持控制信息的回发。关闭视图状态时,您需要确保始终配置控件,而不仅仅是在!IsPostBack时。
请注意,如果您跟踪应该是Visible的内容以及代码中的文本,那么您可以关闭内部控件的viewstate(假设您没有为其分配任何其他属性)。
初步回答:
您正在将Text属性的当前值分配给标签/文本框。如果您没有在当前请求中设置该值,则它具有默认值,因此您将获得空文本。
您可以将视图状态中的值保存为(c#语法):
public string Text
{
get
{
return (string) ViewState["MyText"];
}
set
{
ViewState["MyText"] = value;
}
}
聚苯乙烯。这不是唯一的方法。如果切换没有设置文本,但是你在两个控件的setter上都做了,那么他们会保留这些值(只要在跟踪viewstate之后分配用户控件的Text属性,就像在页面Load中一样) )。
答案 2 :(得分:0)
我明白了!我为愚蠢而道歉。这就是我做错了:我对文本属性的Get / Set存储在私有成员中。这意味着当对文本进行更新时,它不知道,因为它没有连接到文本框。相反,我做了以下事情:
Public Property Text() As String
Get
Return txtText.Text
End Get
Set(ByVal value As String)
txtText.Text = value
End Set
End Property
并在我的Page_Load事件中:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
lblText.Text = Text
Toggle()
End If
End Sub
现在它工作正常!感谢那些让我走上正确道路的人! :)