2009-06-03 3 views
0

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

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

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 

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

ответ

3

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

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

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

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

в

If _value.CompareTo(Nothing) > 0 Then 
2

Проблема заключается в том, что «accessor» записывает содержимое текстового поля поверх переменной _value.


также:

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

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

+0

Загрузка собственности SelectedDateTime происходит внутри Page_Load страницы. Так что это страница page_load -> control page_load, и она по-прежнему не устанавливается. Между афайком нет обратной передачи, или я что-то пропускаю. – Tominator

Смежные вопросы