2010-09-14 10 views
5

Esto es lo que está en mi código subyacente:Mantener la lista genérica entre las devoluciones de datos

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); 
} 

Quiero añadir un elemento a la lista cada vez que se hace clic en el botón Añadir, pero la lista se restablece después de cada devolución de datos . ¿Cómo puedo mantener los datos en la lista entre las devoluciones?

Respuesta

8

que a menudo utilizan una técnica como esta, aunque tenga en cuenta que esto puede causar que su estado de vista (como se hacía en el navegador) para crecer bastante grande:

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

Luego, cuando se desea utilizar la lista que haría algo como esto:

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 
} 

también tenga en cuenta que su clase Event tendrá que ser serializable, pero eso es por lo general tan simple como añadir el atributo [serializable] a la clase (a menos que una clase muy complejo).

+1

No es necesario asignar la lista de eventos a la propiedad Eventos, usted trabaja con referencias. Es la misma lista. –

+0

@Alex Reibort: En realidad, en el getter está deserializando la instancia de la lista fuera del estado de la vista, en el setter está serializando la instancia nuevamente en el estado de vista. La instancia en el código es la misma, pero que desaparece entre las publicaciones posteriores, debe actualizar el estado de la vista después de que se modifique. – CodingGorilla

+0

No, no es así. ViewState almacena deserializa su contenido antes de solicitar la lista, por lo que mantiene la referencia a la lista cuando accede, recupera la referencia, usa la actualización de la instancia y se guardará automáticamente en viewstate. Solo pruébalo. –

1

Deberás mantener la lista de alguna manera. Puede rellenarlo en ViewState, insertarlo en la base de datos, almacenarlo en la sesión, ponerlo en un campo oculto en la página ...

+0

¿qué? ¿Objeto de lista en un campo oculto? – JoshYates1980

1

Guardar la lista en la sesión o mostrar el estado.

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

Gracias CodingGorilla, esto resolvió mi problema. Pero tengo que agregar una cosa más para los recién llegados.

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 
Cuestiones relacionadas