views:

521

answers:

2

Hello,

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?

+1  A: 

The problem is that your "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 your control lives, and therefore a new instance of the control itself.

If you want values for your persisted across postbacks, you will have to put them somewhere that will survive across postbacks like the session or viewstate.

Joel Coehoorn
The loading of the SelectedDateTime property happens within the page_load of the page. So it's page page_load -> control page_load, and it still doesn't get set. There is no postback in between, afaik, or I'm missing something.
Tominator
Sorry, had a minor emergency pull me away for a while. Updated my post with an answer to your real problem.
Joel Coehoorn
Thanks for the help! I guess this question was quite dumb.. sorry :) Hope everythihg is fine with your emergency!
Tominator
+3  A: 

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
d4nt
Indeed, this is correct.. my only excuse is that I was tired :( Thanks!
Tominator