在我的 Windows 窗体中,我通过业务逻辑将两个对象(订单和项目)作为参数传递,并使用这两个对象的不同成员变量在自定义网格中显示一条线。与删除一行类似,业务逻辑传递 UI、订单和项目对象,我使用这两个对象在 Windows 窗体中定位一行并删除它们。order 对象始终是唯一的,但 item 对象可能是也可能不是唯一的。
仅当满足某些条件时才在网格上显示一条线,并且即使未显示线但未满足这些条件但两个对象(订单和项目)保留在列表中,因此当条件满足时,该线被展示。一旦显示该行,如果某些条件为真,该行将再次隐藏,但像以前一样,订单和项目对象都被存储以供将来显示。
目前,我将订单对象保留在订单通用列表中,并将项目对象保留在项目通用列表中。当我必须添加或删除一行时,我在订单列表中查找订单对象,找到索引,使用相同的索引从项目列表中检索项目并使用这两个对象显示一行。我觉得这种逻辑本质上是有风险的,因为我使用一个列表中的索引来访问另一个列表中的项目,并假设两个列表大小始终相同。有没有更好的实现方式??
class BusinessLogic
{
internal void UpdateUI()
{
OrderGrid.AddLine(order,item, bAddLine);
}
}
public class OrderGrid : System.Windows.Forms
{
ArrayList OrderList = new ArrayList()//This contains unique orders only
ArrayList ItemList = new ArrayList() //This list can have duplicates
public void DrawLine(Order order, Item item, bool bAddLine)
{
if(bAddLine)
{
if(currDisplayedLines <= MaxLinestoDisplay)
{
DrawLine(order,item);
}
else
{
OrderList.Add(order);
ItemList.Add(item);
}
}
else//remove line
{
int idx = OrderList.IndexOf(order);
if(idx < 0)
return;
OrderList.RemoveAt(idx);
ItemList.RemoveAt(idx);//not a good idea to use another list's index here)
}
}
private void ClockTick()
{
if (currDisplayedLines < MaxLinestoDisplay)
{
for(int i = 0; i <OrderList.Count; i++)
{
while(currDisplayedLines < MaxLinestoDisplay)
{
order = (Order)OrderList[i];
item = (Item)ItemList[i];
DrawLine(order,item)
currDisplayedLines++;
}
}
}
}
}