2017-06-17 66 views
0

我的问题是我的列表在回发过程中没有被保留。 我将其保存到当CheckBoxList被触发时,会话将不会在PostBack上存储属性

Page.Session["mine"] 

我的设计页面包含2个控制器(标签和CheckBoxList的)。因为项目数量会发生变化,所以我使用CheckBoxList而不是单独的CheckBox控件,并在page_load()中动态加载每个项目。

我不确定它被称为成员,属性或属性。但我确实有一个变量,每个类的方法都可以调用,以保存CheckBoxList上所有选定项的位置。

Private List<int> locCheck = new List<int>(); 

当OnSelectedIndexChanged()被触发时,locCheck被更新,并存储在会话

locCheck = new List<int>(); 
int num = 0; 
foreach(ListItem li in CheckBoxList.Items) 
{ 
    if(li.Selected) 
     locCheck.Add(num); 

    num++; 
} 

if(locCheck.Count == 0) //for testing purpose 
    locCheck.Add(1); //2nd item 

Page.Session["mine"]=locCheck; 

我想保持选定的检查上回发,但它永远不会发生。在Visual Studio中,我没有问题。但是,当我加载到服务器上,我使用的单,我得到以下信息:

Object reference not set to an instance of an object 

我有这个在Page_Load中

if(Page.IsPostBack) 
{ 
    locCheck = new List<int>(); 
    locCheck = (List<int>) Page.Session["mine"]; 
    Label.Text = String.Format("Is PostBack {0}/{1}", locCheck.Count, CheckBoxList.Items.Count); 
} 
else 
{ 
    Label.Text = String.Format("Is Not PostBack 0/{0}", CheckBoxList.Items.Count); 
} 

我知道问题出在这一行,因为locCheck.Count从未在Label.Text变化

locCheck =(List<int>) Page.Session["mine"]; 

我知道我必须附上

if(Page.Session["mine"] != null) 

但我不相信这是目前的必需品。由于测试目的,它应该始终具有至少包含一个元素的locCheck。

我找不到答案,所以我从头开始。而不是清单,我使用的复选框面板在不需要时会变为不可见。

我对Sessions仍然不确定,但是我发现了一些奇怪的东西。

例如:

Session["mine"] = locCheck; //where lockCheck has 4 elements 

有一些locCheck设置为某个时候的Page_Load之间空的按钮点击次数。 我发现,如果是这样,调试回locCheck不为空,并具有正确的元素值的点。然后执行以下操作:

Session["mine"] = locCheck; 

,后来,你在点击事件

locCheck = new List<int>(); 
locCheck = (List<int>) Session["mine"]; 

//then make your update: 
locCheck[3] = 7; 
Session["mine"] = locCheck; 

执行以下代码出于某种原因,如果我不这样做了Session [“雷”]和locCheck变为空,数据丢失。

回答

0

尝试使用此

 locCheck = (List<int>) Page.Session["mine"].ToString(); 

为什么要使用page.session时,只能使用会话。