Tominator
Tominator

Reputation: 1224

My asp.net control loses its property values?

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

Answers (2)

Joel Coehoorn
Joel Coehoorn

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

d4nt
d4nt

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

Related Questions