2009-12-28 4 views
1

Мы используем List<object> типа в качестве источника данных для раскрывающегося списка.Список <> удалить предмет выпуска

потока процесса:

  1. значение Присвоить (List<object>) на сессии в случае Pageload (!ispostback).
  2. Получить значение из сессии в ddl_SelectedIndexChanged случае
  3. Удалить конкретный элемент из списка и связываются с DDL

Код:

List<Loc> locList = new List<Loc>(); 
locList = (List<Loc>)Session["Loc"]; 
locID = "xxx"; 

locList.RemoveAt(locList.FindIndex(FindLocation)); 

Проблема:

товара становится удален из базового источника также (сеанс).

+2

Обратите внимание, что 'новый список ()' не нужен и отбрасывается каждый раз. –

ответ

4

Проблема в том, что вы манипулируете списком, который хранится в сеансе, а не копией. Вместо этого, если вы делаете что-то вроде этого:

List<Loc> locList = new List<Loc>((List<Loc>)Session["Loc"]); 
locID = "xxx"; 

locList.RemoveAt(locList.FindIndex(FindLocation)); 

вы работаете на копии описи, а оригинал не изменится.

+0

Спасибо за помощь – Geeth

4

Похоже, что вы храните список в сеансе, извлекаете его и мутируете. Фактически, вы можете увидеть разные результаты, если вы перейдете из состояния в процессе в состояние распределенного состояния или базы данных.

Проблема в том, что с находящимся в процессе состоянии есть только один список. Он не сериализуется/десериализован, поэтому, когда вы удаляете элемент, он остается удаленным. Вы можете легко клонировать список:

locList = new List<Loc>(locList); 

, который должен решить эту проблему. В других реализациях состояния данные сериализуются, и каждая десериализованная копия является отдельной, поэтому вы не увидите этого. Но я не буду зависеть от реализации государства. Лично я никогда не понимал, почему такие изменения, изменяющие поведение, разрешены с состоянием; Я бы предпочел, чтобы всегда сериализовать/десериализовать, даже в процессе.

+0

Спасибо за информацию – Geeth

Смежные вопросы