【问题标题】:c# list overwrite issue [duplicate]c#列表覆盖问题[重复]
【发布时间】:2012-12-01 12:07:24
【问题描述】:

我有一些如下所示的代码,它们将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);
 }

【问题讨论】:

    标签: c# list gridview


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      您只分配一次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"])
          );
      }
      

      【讨论】:

        【解决方案3】:

        您正在循环之外创建新的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 移动到循环中

        【讨论】:

          猜你喜欢
          • 2010-12-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-11
          • 1970-01-01
          • 1970-01-01
          • 2020-09-03
          • 2021-01-12
          • 2020-07-07
          相关资源
          最近更新 更多