我有一个控件列表视图。每行包含一个复选框和另一个列表视图。
外部列表视图绑定到控件上的属性(通过方法调用,不能将属性设置为它将出现的ObjectDataSource上的SelectMethod),这是一个延迟加载的:
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
数据源引用的对象的形状如下:
(伪码)
Product
{
bool Licenced;
List<Charge> charges;
}
Charge
{
int property1;
string property2;
bool property3
.
.
.
}
使用viewstate的原因是:
当检查或取消选中其中一个外部列表视图行上的一个复选框时,我想修改ODS表示的对象(例如,我将向相关的Product对象添加几个Charge对象)和然后重新绑定。
我遇到的问题是每次回发后(特别是在检查或取消选中其中一行的复选框后),我的视图状态为空。这意味着我对viewstate'd对象所做的任何更改都将丢失。
现在,我已经研究过(经过大量的谷歌搜索和阅读,以及其他许多人,Scott Mitchel在ViewState上的优秀位置),在初始数据绑定期间 IsTrackingViewState 设置为false。这意味着,我认为,在初始数据绑定期间将GetWebServiceProductLineChargeDetails()的返回值分配给我的Property Get中的ViewState项将不起作用。
请注意,即使 IsTrackingViewState 为真,我调用属性Get,然后进行下一次回发,viewstate为空。
那么你是否有任何关于如何在回发之间保持ViewState中ObjectDataSource引用的对象并更新它并让这些更改保留在ViewState中的想法?这已经持续了几天,我已经厌倦了!
提前干杯
史蒂夫
答案 0 :(得分:0)
为了在视图状态中跟踪更改,当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