我有一些代码如下所示,它将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);
}
答案 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
移至循环