PAW.Btrieve oBtrieve = new PAW.Btrieve();
PAW.CustomerClass oCustomer = new PAW.CustomerClass();
int Status = oBtrieve.Connect("Z:\\payinc");
if (Status == 0)
{
GC.Collect();
Status = oCustomer.OpenFile();
if (Status == 0)
{
Status = oCustomer.GetFirst();
int cnt = oCustomer.RecordCount();
List<Customer> Custlist = new List<Customer>();
for (int i = 0; i < cnt; i++)
{
Custlist.Add(oCustomer);
oCustomer.GetNext();
}
GridView1.DataSource = Custlist;
GridView1.DataBind();
}
Status = oCustomer.CloseFile();
GC.Collect();
}
oBtrieve.Disconnect();
oBtrieve = null;
在这段代码的最后,我有数据网格中显示的最后一个客户的28份副本,而不是我想要看到的28位不同客户。有没有办法只存储来自oCustomer对象的数据而不是对oCustomer对象的依赖?
答案 0 :(得分:3)
看起来您正在使用的特定API会为其检索的每个客户重复使用相同的CustomerClass实例:
oCustomer.GetNext();
因此,每次将oCustomer添加到列表中时,都会添加相同的实例,并且对“GetNext”的调用正在更改该实例的属性。
我建议将oCustomer的各个属性复制到该类的新实例中,并将其添加到列表中。也许是这样的事情:
Custlist.Add(new CustomerClass
{
// obviously I don't know what the properties of
// CustomerClass are, so humour me.
Name = oCustomer.Name,
Address = oCustomer.Address,
Phone = oCustomer.Phone
});
这样,您每次都会在列表中添加不同的客户实例。
答案 1 :(得分:1)
您要为每个人添加oCustomer
。您应该使用迭代器i
来访问oCustomer中的(我认为是什么)集合。
我不确定你的班级结构是什么,但是
for (int i = 0; i < cnt; i++)
{
Custlist.Add(oCustomer);
oCustomer.GetNext();
}
应该是:
for (int i = 0; i < cnt; i++)
{
Custlist.Add(oCustomer[i]);
oCustomer.GetNext();
}
另外,请勿使用GC.Collect()
。那只是在寻找麻烦。
答案 2 :(得分:1)
我猜这是因为PAW.CustomerClass是一个引用类型,而CustomerClass.GetNext()将下一个项目读入现有对象......而不是创建一个新项目。
每次将对象添加到列表时,它都会添加对象的引用而不是对象的副本。这意味着当您在将对象添加到列表后更新对象上的值时,列表中的对象将反映这些更改...并且由于GetNext()每次迭代都会对同一对象进行更改,因此您的列表有29个引用SAME CustomerClass对象。
您可以尝试更改以下行:
Custlist.Add(oCustomer);
到
// assuming a shallow copy will work for this object
Custlist.Add(oCustomer.MemberwiseClone());