c#list覆盖问题

时间:2012-12-01 12:07:24

标签: c# list gridview

我有一些代码如下所示,它将gridview的值写入列表,如图所示。 代码确实获得了正确的值,但是当网格的第二行添加到列表中时,它会覆盖列表的第一行。
有人知道为什么会这样吗?

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

3 个答案:

答案 0 :(得分:7)

您正在创建一个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);
}

答案 1 :(得分: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"])
    );
}

答案 2 :(得分: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移至循环