2012-12-01 124 views
0

我有一些如下所示的代碼,將gridview的值寫入列表中,如圖所示。 代碼確實獲得了正確的值,但是當網格的第二行被添加到列表中時,它將覆蓋列表的第一行。
有人知道爲什麼會發生這種情況?c#列表覆蓋問題

C#代碼

List<Item> lstNewItems = new List<Item>(); // Control Items 
lstNewItems.Clear(); 
Item NewItem = new Item(); 
foreach (GridViewRow PendingItemUnderControl in GridViewPendingList.Rows) 
{ 
    NewItem.Paramater = PendingItemUnderControl.Cells[0].Text.ToLower(); 
    NewItem.Type = (String)Session["BrowseType"]; 
    lstNewItems.Add(NewItem); 
} 

回答

6

你正在創建Item類的一個實例。它發生在你的循環之前,所以實際上你正在研究同一個對象。您需要創建內部循環的新實例(在每次迭代):

List<Item> lstNewItems = new List<Item>(); // Control Items 
lstNewItems.Clear(); 

foreach (GridViewRow PendingItemUnderControl in GridViewPendingList.Rows) 
{ 
    Item NewItem = new Item(); 
    NewItem.Paramater = PendingItemUnderControl.Cells[0].Text.ToLower(); 
    NewItem.Type = (String)Session["BrowseType"]; 
    lstNewItems.Add(NewItem); 
} 
3

這是因爲你一直添加相同的對象,你變異它在每次循環。

您只分配NewItem一次,然後您配置並將其添加到列表中。但是,當列表中的項目重新配置並且第二次將其添加到列表中時。現在您將兩項配置爲最後一項。然後將其配置爲第三項,然後重新添加。但是,所有這三項都配置相同,但前兩個參數和類型已消失。循環結束後,您的列表中最後一個項目的N副本

移動new內循環來解決這個問題:

foreach (GridViewRow PendingItemUnderControl in GridViewPendingList.Rows) 
{ 
    Item NewItem = new Item(); 
    .... 
} 

更重要的是,讓你的Item不變,並把它傳遞參數的構造函數:

foreach (GridViewRow PendingItemUnderControl in GridViewPendingList.Rows) 
{ 
    lstNewItems.Add(new Item(
     PendingItemUnderControl.Cells[0].Text.ToLower() 
    , (String)Session["BrowseType"]) 
    ); 
} 
1

你是在循環外部創建新的Item,所以每次更新相同的元素時都是如此。

foreach (GridViewRow PendingItemUnderControl in GridViewPendingList.Rows) 
{ 
    Item NewItem = new Item(); <------ 
    NewItem.Paramater = PendingItemUnderControl.Cells[0].Text.ToLower(); 
    NewItem.Type = (String)Session["BrowseType"]; 
    lstNewItems.Add(NewItem); 

} 

移動new進入循環