Как использовать объект viewstate'd в качестве источника данных для элементов управления в пользовательском элементе управления - PullRequest
0 голосов
/ 29 декабря 2010

У меня есть просмотр списка элемента управления.Каждая строка содержит флажок и другое представление списка.

Внешний просмотр списка связан со свойством элемента управления (посредством вызова метода не может установить свойство как SelectMethod для объекта ObjectDataSource, в котором оно будет отображаться), котороезагружается ленивый так:

    Public ReadOnly Property ProductLineChargeDetails() As List(Of WebServiceProductLineChargeDetail)
    Get
        If ViewState("WSProductLineChargeDetails") Is Nothing Then
            ViewState("WSProductLineChargeDetails") = GetWebServiceProductLineChargeDetails()
        End If

        Return DirectCast(ViewState("WSProductLineChargeDetails"), Global.System.Collections.Generic.List(Of Global.MI.Open.WebServiceProductLineChargeDetail))
    End Get
End Property

Форма объекта, на который ссылается источник данных, выглядит примерно так:

(psuedocode)

Product
{
 bool Licenced;
 List<Charge> charges;
}

Charge
{
 int property1;
 string property2;
 bool property3
 .
 .
 .
}

Причинаиспользование viewstate таково:

Когда один из флажков в одной из строк представления внешнего списка отмечен или снят, я хочу изменить объект, который представляет ODS (например, я добавлю паруЗарядите объекты до соответствующего объекта Product), а затем выполните повторную привязку.

Проблема, с которой я сталкиваюсь, заключается в том, что после каждой обратной передачи (в частности, после установки или снятия флажка одной из строк) мое представление состояния пусто.Это означает, что любые изменения, которые я делаю в своем объекте viewstate, будут утеряны.

Теперь я разработал (после долгих поисков и поиска, среди многих других, превосходный бит Скотта Митчела во ViewState), что во время начальнойпривязка данных IsTrackingViewState имеет значение false.Я думаю, это означает, что назначение возврата из GetWebServiceProductLineChargeDetails () для элемента ViewState в моем свойстве Get во время начальной привязки данных не будет работать.

Имейте в виду, даже когда IsTrackingViewState имеет значение true, и я вызываю свойство Get, приходите при следующей обратной передаче, состояние просмотра пусто.

Итак, у вас есть парни?идеи о том, как сохранить объект, на который ссылается ObjectDataSource в ViewState, между постбэками, обновить его и заставить эти изменения остаться в ViewState?Это продолжается уже пару дней, и я сыт по горло!

Заранее спасибо

Стив

1 Ответ

0 голосов
/ 29 декабря 2010

Для отслеживания изменений в состоянии просмотра объект должен быть назначен в состояние просмотра, когда IsTrackingViewState имеет значение True.Viewstate начинает отслеживать после Init в жизненном цикле страницы.Вы, вероятно, слишком рано связываете объекты для хранения в viewstate.Вы должны связать представление списка после этапа Init, возможно, на этапе загрузки.

т.е.

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
    ListView.DataSource = ProductLineChargeDetails
    ListView.DataBind
End Sub
...