2013-03-07 15 views
1

我遇到了输出到WebGrid的问题,因为我的列表被覆盖,所以最后我为网格上的每一行都写了最后一行数据。我必须使用while循环,因为数据不断添加到数据中,而且我们正在查看大量数据,所以我试图不写入另一个列表。关于在while循环中覆盖数据

public class ChemData 
{ 
    string strSQLconnection = "Server=Server;Database=data;Uid=Username;Pwd=Password"; 

    public int productId { get; set; } 
    public string productName { get; set; } 

    public List<ProdData> ProdList = new List<ProdData>(); 

    public List<ProdData> ProdDataPull() 
    { 
     ProdData Analysis = new ProdData(); 
     SqlDataReader reader = null; 
     SqlConnection conn = new SqlConnection(strSQLconnection); 
     SqlCommand query = new SqlCommand("Select * from producttable"); 

     conn.Open(); 
     query.Connection = new SqlConnection(strSQLconnection); 
     query.Connection.Open(); 
     reader = query.ExecuteReader(); 
     while (reader.Read()) 
     { 
      if (!reader.IsDBNull(0)) Analysis.productId = reader.GetInt32(0); 
      if (!reader.IsDBNull(1)) Analysis.productName = reader.GetString(1); 

      ProdList.Add(Analysis); 
     } 
     return ChemList; 
    } 
} 
+2

你是说你想要一个网格不断列出项目,因为他们被添加?为此,你可能会需要一些奇特的AJAX ... – 2013-03-07 00:08:23

+0

请更新您的帖子与所有'while'循环。你似乎错过了大括号(如果不是更多)。 – Brian 2013-03-07 00:08:47

+0

那么,你发布的代码是不完整的..对吧?你可以发布完成的吗? – 2013-03-07 00:08:52

回答

2

这是因为Analysis只创建一次。每次将它添加到列表中都会添加对同一对象的引用。移动创立到while循环中应该解决这个问题

while (reader.Read()) 
{ 
    ProdData Analysis = new ProdData(); 
    if (!reader.IsDBNull(0)) Analysis.productId = reader.GetInt32(0); 
    if (!reader.IsDBNull(1)) Analysis.productName = reader.GetString(1); 

    ProdList.Add(Analysis); 
} 

这就造成在每次循环新ProdData对象,并将其分配给Analysis,然后更新其内容,并补充说,参考名单。

在循环外部创建AnalysisAnalysis继续指向同一个ProdData对象,该对象被重复添加到列表中,而每次都会覆盖它的值。

请参阅:Reference Types vs. Value Types