Мой элемент управления asp.net теряет свои значения свойств? - PullRequest
0 голосов
/ 03 июня 2009

Я пишу пользовательский элемент управления для моего сайта asp.net для хранения datetime. Он имеет два свойства:

    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 самого элемента управления, значение свойства обнуляется!

Загрузка страницы элемента управления:

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

Есть идеи, почему это свойство теряет свою ценность?

Ответы [ 2 ]

3 голосов
/ 03 июня 2009

Метод Page_Load вашего элемента управления использует свойство SelectedDateTime, а не базовое поле _value.

Метод Get для свойства SelectedDateTime перестраивает _value из содержимого txtDate (и txtHour и т. Д.). Поэтому независимо от того, какое значение _value вы установили, свойство SelectedDateTime будет возвращать то, что было в текстовых полях, что, как я полагаю, является ничем, поскольку страница только загружается.

Я предлагаю вам изменить

If SelectedDateTime().CompareTo(Nothing) > 0 Then

до

If _value.CompareTo(Nothing) > 0 Then
2 голосов
/ 03 июня 2009

Проблема в том, что метод доступа "get" записывает содержимое текстового поля поверх переменной _value.


Также:

Каждый раз, когда вы делаете новую обратную передачу, вы работаете с новым экземпляром класса страницы, в котором этот элемент управления живет, и, следовательно, с новым экземпляром самого элемента управления.

Если вы хотите, чтобы значения для элемента управления сохранялись во всех обратных передачах, вы должны поместить их в такое место, которое будет сохраняться во всех обратных передачах, например в сеансе или в состоянии просмотра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...