Reputation: 1224
I'm writing a custom user control for my asp.net site, for storing datetimes. It has two properties:
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
I call my custom control in this way:
<my:DateTimeInput runat="server" includetime="true" ID="txtWhen" />
This sets the includetime property correctly.
In my backend code I also do this on page_load:
txtWhen.SelectedDateTime = now
When I step through with the debugger, I see that the property gets set, BUT when the page_load of the control itself loads, the property value is reset to nothing!
The page_load of the control:
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
Any ideas why this property loses its value?
Upvotes: 0
Views: 1829
Reputation: 415820
The problem is the "get
" accessor writes the textbox contents over top of the _value
variable.
Also:
Every time you do a new postback, you are working with a new instance of the page class where that control lives, and therefore a new instance of the control itself.
If you want values for the control persisted across postbacks, you must put them somewhere that will survive across postbacks, like the session or viewstate.
Upvotes: 2
Reputation: 15769
Your control's Page_Load method uses the SelectedDateTime property rather than the underlying _value field.
The Get method for the SelectedDateTime property rebuilds _value from the contents of txtDate (and txtHour etc...). So regardless of what you set _value to, the SelectedDateTime property will return what was in the text boxes, which I presume is nothing because the page is only just loading.
I suggest you change
If SelectedDateTime().CompareTo(Nothing) > 0 Then
to
If _value.CompareTo(Nothing) > 0 Then
Upvotes: 3