0

我有一些下面显示的代码,它们将 a 的值写入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);
 }
4

3 回答 3

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);
}
于 2012-12-01T12:09:07.937 回答
3

这是因为您不断添加相同的对象,并且在循环的每次迭代中都对其进行了变异。

您只分配NewItem一次,然后配置并将其添加到列表中。但是,当列表中的项目时,您重新配置它并将其第二次添加到列表中。现在您将两个项目配置为最后一个项目。然后将其配置为第三项,并再次添加。但是,所有三个项目的配置都相同:前面的两个参数和类型都消失了。循环完成后,您将拥有列表中相同最后一项的N 副本

移动new循环内部以解决问题:

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

更好的是,让你的Item immutable,并在构造函数中传递参数:

foreach (GridViewRow PendingItemUnderControl in GridViewPendingList.Rows)
{
    lstNewItems.Add(new Item(
        PendingItemUnderControl.Cells[0].Text.ToLower()
    ,   (String)Session["BrowseType"])
    );
}
于 2012-12-01T12:09:23.060 回答
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到循环中

于 2012-12-01T12:09:50.840 回答