在我的Windows窗体中,我通过业务逻辑将两个对象(order和Item)作为参数传递,我使用两个对象的不同成员变量在自定义网格中显示一行。类似于删除一行,业务逻辑传递UI,订单和项目对象,我使用这两个来定位Windows窗体中的一行并删除它们。 订单对象始终是唯一的,但是商品对象可能是也可能不是唯一的。
如果满足某些条件并且即使没有显示这些条件但是这两个对象(订单和项目)保存在列表中,那么当条件确实变为真时,线条仅显示在网格上,显示该行。一旦显示该行,如果某些条件为真,则该行再次被隐藏,但与之前一样,将存储订单和项目对象以供将来显示。
目前,我将订单对象保存在订单通用列表中,将项目对象保留在项目通用列表中。 当我必须添加或删除一行时,我在订单列表中查找订单对象,找到索引,使用相同的索引从项目列表中检索项目,并使用这两个对象显示一行。我觉得这个逻辑具有固有的风险,因为我使用一个列表中的索引来访问另一个列表中的项目,并假设两个列表大小始终相同。有没有更好的方法来实现它?
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++;
}
}
}
}
}
答案 0 :(得分:1)
每当你有两个列表,其中两个列表的同一索引处的项目“属于”在一起时,您可以将其转换为具有两个属性的新类型的单个列表,一个表示每种类型类型。听起来这种转变在这里是合适的。只需创建一个具有Order
和Item
属性的新类型,每种类型都适当。
答案 1 :(得分:0)
为什么不创建另一个包含两个引用的类:
class ItemOrderContainer
{
public Item Item { get; set; }
public Order Order { get; set; }
public bool Show { get { return /*some condition*/; }
}
也许我没有理解这个问题,但将各种事物放在一起是一种很好的做法。您仍然可以有多个ItemOrderContainer
个对象引用相同的Item
。