我正在为我的asp.net网站编写一个自定义用户控件,用于存储日期时间。它有两个属性:
Private _includeTime As Boolean
Private _value As DateTime = Nothing
Public Property IncludeTime() As Boolean
Get
Return _includeTime
End Get
Set(ByVal value As Boolean)
_includeTime = value
End Set
End Property
Public Property SelectedDateTime() As DateTime
Get
Try
_value = DateTime.Parse(txtDate.Text)
If IncludeTime Then
_value.AddHours(Short.Parse(txtHour.Text))
_value.AddMinutes(Short.Parse(txtMinute.Text))
_value.AddSeconds(Short.Parse(txtSecond.Text))
End If
Catch ex As Exception
_value = Nothing
End Try
Return _value
End Get
Set(ByVal value As DateTime)
_value = value
End Set
End Property
我以这种方式调用我的自定义控件:
<my:DateTimeInput runat="server" includetime="true" ID="txtWhen" />
这会正确设置includetime属性。
在我的后端代码中,我也在page_load上执行此操作:
txtWhen.SelectedDateTime = now
当我使用调试器时,我看到属性被设置,但是当控件本身的page_load加载时,属性值被重置为空!
控件的page_load:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
lbltime.Visible = IncludeTime
If SelectedDateTime().CompareTo(Nothing) > 0 Then
txtDate.Text = SelectedDateTime.Date.ToShortDateString()
txtHour.Text = SelectedDateTime.Hour.ToString("D2")
txtMinute.Text = SelectedDateTime.Minute.ToString("D2")
txtSecond.Text = SelectedDateTime.Second.ToString("D2")
End If
End Sub
为什么这个属性失去价值的任何想法?
答案 0 :(得分:3)
您的控件的Page_Load方法使用SelectedDateTime属性而不是基础_value字段。
SelectedDateTime属性的Get方法从txtDate(和txtHour等...)的内容重建_value。因此无论你将_value设置为什么,SelectedDateTime属性都会返回文本框中的内容,我认为这些内容都没有,因为页面只是加载。
我建议你改变
If SelectedDateTime().CompareTo(Nothing) > 0 Then
到
If _value.CompareTo(Nothing) > 0 Then
答案 1 :(得分:2)
问题是“get
”访问者将文本框内容写在_value
变量的顶部。
此外:
每次执行新的回发时,您正在使用该控件所在的页面类的新实例,因此是控件本身的新实例。
如果您希望控件的值在回发中保持不变,则必须将它们放在可以在回发中存在的某个位置,例如会话或视图状态。