我有一个从sql存储过程填充的List(T)。
dailyReqsList = ShipDB.GetDailyReqs(loadValues);
此列表填充数据网格视图。
dgvDailyReqs.DataSource = dailyReqsList;
dgvDailyReqs.Refresh();
CurrencyManager cm =
CurrencyManager)(dgvDailyReqs.BindingContext[dailyReqsList]);
cm.Refresh();
如果单击特定单元格,它将打开一个表单并相对于该行拉取数据。在该表单上,您可以从列表框中选择可能引用datagridview中的一个或多个项目(行)的项目。如果选中一个复选框,它将返回到datagridview并从列表框中减去确定的金额。这一切都很有效 - 第一关。当您再次执行此操作时,要添加另一个框,它将再次减去新数据和旧数据。这是下面列出的代码。
orderDeduct = ShipDB.GetDeduction(dailyReq);
List<ItemMaster> deductedReq = new List<ItemMaster>(dailyReqsList);
if (deductedReq[v].Balance == dailyReqsList[v].Balance)
{
if (orderDeduct.QtyShipped > 0)
{
if (deductedReq[v].QtyReqDay1 > 0)
{
if (orderDeduct.QtyShipped >= DeductedReq[v].QtyReqDay1)
{
orderDeduct.QtyShipped = orderDeduct.QtyShipped –
deductedReq[v].QtyReqDay1;
deductedReq[v].QtyReqDay1 = 0;
}
else
{
deductedReq[v].QtyReqDay1 = deductedReqv].QtyReqDay1
- orderDeduct.QtyShipped;
orderDeduct.QtyShipped = 0;
}
}
}
…
deductedReq[v].Balance = deductedReq[v].QtyOnHand
- deductedReq[v].QtyCommitted
+ deductedReq[v].QtyReqDay1 + deductedReq[v].QtyReqDay2
+ deductedReq[v].QtyReqDay3 + deductedReq[v].QtyReqDay4
…
}
代码遵循了七天,就像我上面说的那样,在第一遍中效果很好。问题是当你再次使用该方法时,我想到了这一行
List<ItemMaster> deductedReq = new List<ItemMaster>(dailyReqsList);
会制作原始列表的副本,我会将其用作运行总计列表,如果它们不相等,我可以与原始列表进行比较。这就是行
的原因if (deductedReq[v].Balance == dailyReqsList[v].Balance)
我假设将检查从原始列表(dailyReqsList)到deductedReq列表的余额。任何帮助我指向正确方向的人都表示赞赏。
答案 0 :(得分:0)
就像Sabrina所说,我需要更改ItemMaster类来执行深层复制而不是浅层复制。
我对它进行了以下更改。
public ItemMaster ShallowCopy()
{
return (ItemMaster)this.MemberwiseClone();
}
和
public ItemMaster DeepCopy()
{
ItemMaster clonedItem = (ItemMaster)this.MemberwiseClone();
clonedItem.Balance = Balance;
clonedItem.QuantityOnHand = QuantityOnHand;
clonedItem.QuantityCommitted = QuantityCommitted;
clonedItem.QuantityAvailable = QuantityAvailable;
clonedItem.QtyReqDay1 = QtyReqDay1;
clonedItem.QtyReqDay2 = QtyReqDay2;
clonedItem.QtyReqDay3 = QtyReqDay3;
clonedItem.QtyReqDay4 = QtyReqDay4;
clonedItem.QtyReqDay5 = QtyReqDay5;
clonedItem.QtyReqDay6 = QtyReqDay6;
clonedItem.QtyReqDay7 = QtyReqDay7;
return clonedItem;
}
然后我改变了行
List<ItemMaster> deductedReq = new List<ItemMaster>(dailyReqsList);
到
deductedReq = dailyReqList.ConvertAll(ItemMaster => ItemMaster.DeepCopy());
并调用CalculateDeductions(dailyReqList [v])方法。
另外,我更改了List(deductedReq)的范围 - 它是该方法的本地范围,现在它的形式很宽。这是因为它在一种方法中创建并在另一种方法中更新。
我希望这个解释有助于澄清我遇到的问题及其解决方法。