2017-06-17 3 views
0

Mon problème est que ma liste n'est pas conservée pendant PostBack. Je gardais enSession ne stockera pas l'attribut sur PostBack lorsque CheckBoxList est déclenché

Page.Session["mine"] 

Ma page de conception se compose de 2 commandes (une étiquette et un CheckBoxList).

Parce que le nombre d'éléments va changer, j'utilise un CheckBoxList au lieu de contrôles individuels CheckBox et charge chaque élément de manière dynamique dans le page_load();

Je ne suis pas certain de ce que l'on appelle un membre, un attribut ou une propriété. Mais j'ai une variable à laquelle chaque méthode de la classe peut faire appel et qui contient l'emplacement de tous les éléments sélectionnés sur CheckBoxList.

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

Lorsque le OnSelectedIndexChanged() est déclenchée, le locCheck est renouvelé et stocké en session

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; 

Je veux garder les contrôles sélectionnés lors de la publication, mais il ne se produit jamais. Dans Visual Studio, je n'ai aucun problème. Mais quand je charge au serveur, j'utilise mono, je reçois le message suivant:

Object reference not set to an instance of an object 

Je cela dans 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); 
} 

Je sais que le problème est avec cette ligne parce que jamais locCheck.Count changements dans Label.text

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

Je sais que je dois joindre

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

Mais je ne crois pas que ce soit actuellement nécessaire. A des fins de test, il devrait toujours avoir locCheck avec au moins un élément.

Je n'ai pas trouvé de réponse, donc j'ai commencé à zéro. Au lieu de checklists, j'utilise des panneaux de cases à cocher qui deviennent invisibles quand ils ne sont pas nécessaires.

Je ne suis toujours pas sûr des sessions mais j'ai trouvé quelque chose d'étrange.

Par exemple:

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

il y a des moments que locCheck est réglé sur null quelque temps entre page_load à un bouton clic. J'ai trouvé que lorsque c'est le cas, déboguer à un point où locCheck n'est pas nulle et a des valeurs d'éléments corrects. puis effectuez ce qui suit:

Session["mine"] = locCheck; 

et plus tard, vous effectuez le code suivant dans l'événement clic

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

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

pour une raison quelconque, si je ne le fais pas à la fois Session [ « mine »] et locCheck devenir nul et les données sont perdues.

Répondre

0

essayez d'utiliser cette

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

pourquoi utiliser page.session lorsque vous pouvez utiliser la session uniquement.