2010-09-14 5 views
5

Voici ce qui est dans mon code-behind:Maintenir la liste générique entre postbacks

List<Event> events = new List<Event>(); 

protected void Page_Load(object sender, EventArgs e) 
{ 

} 

protected void AddEvent_Click(object sender, EventArgs e) 
{ 
    Event ev = new Event(); 

    ev.Name = txtName.Text; 

    events.Add(ev); 
} 

Je veux ajouter un élément à la liste chaque fois que le bouton Ajouter est cliqué, mais la liste est remis à zéro après chaque postback . Comment puis-je conserver les données dans la liste entre les publications?

Répondre

8

J'utilise souvent une technique comme celle-ci, bien garder à l'esprit ce qui peut causer votre viewstate (comme rendu au navigateur) de se développer assez grand:

public List<Event> Events 
{ 
    get { return (List<Event>)ViewState["EventsList"]; } 
    set { ViewState["EventsList"] = value; } 
} 

Ensuite, lorsque vous voulez utiliser la liste que vous ferait quelque chose comme ceci:

public void AddToList() 
{ 
    List<Event> events = Events; // Get it out of the viewstate 
    ... Add/Remove items here ... 
    Events = events; // Add the updated list back into the viewstate 
} 

notez également que votre classe d'événement devra être sérialisable, mais qui est généralement aussi simple que l'ajout de l'attribut [Serializable] à la classe (sauf si c'est une classe vraiment complexe).

+1

Vous n'avez pas besoin d'affecter la liste des événements à la propriété Events, vous travaillez avec des références. C'est la même liste. –

+0

@Alex Reibort: En fait, dans le getter, vous désérialisez l'instance de la liste hors de l'état d'affichage, dans le setter, vous remettez l'instance en série dans l'état d'affichage. L'instance dans le code est la même, mais cela disparaît entre les post-retours, vous devez actualiser l'état d'affichage après qu'il a été modifié. – CodingGorilla

+0

Non, vous ne le faites pas. ViewState maintient son contenu désérialisé avant que vous demandiez la liste, ainsi il maintient la référence à la liste quand vous y accédez, vous récupérez la référence, utilisez-la pour mettre à jour l'instance et elle sera automatiquement enregistrée dans viewstate. Juste le tester. –

1

Vous devrez maintenir la liste vous-même. Vous pouvez le placer dans ViewState, le pousser dans la base de données, le stocker dans la Session, le placer dans un HiddenField sur la page ...

+0

quoi? Liste l'objet dans un HiddenField? – JoshYates1980

1

Enregistrer la liste dans la session ou viewstate.

protected void AddEvent_Click(object sender, EventArgs e) 
{ 
    Event ev = new Event(); 

    ev.Name = txtName.Text; 
    if(Session["events"] == null) 
    { 
     Session["events"] = new List<Event>(); 
    } 
    var events = (List<Event>)Session["events"]; 
    events.Add(ev); 
} 
0

Merci CodingGorilla, cela a résolu mon problème. Mais je dois ajouter une chose pour les nouveaux arrivants.

List<Event> events = Events; // Get it out of the viewstate 
**You should check whether events is null** 
Events = events; // Add the updated list back into the viewstate