R – My asp.net control loses its property values

asp.netcontrolsvb.net

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?

Best Answer

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
Related Topic