0

在我的 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++;
                }
            }
        }
    }
}
4

2 回答 2

1

每当您有两个列表,其中两个列表的相同索引处的项目“属于”在一起时,您可以将其转换为具有两个属性的新类型的单个列表,一个代表每个类型类型。听起来在这里进行这种转变是合适的。只需创建一个具有OrderandItem属性的新类型,每个类型都是适当的。

于 2013-02-01T15:17:44.990 回答
0

为什么不创建另一个包含两个引用的类:

class ItemOrderContainer
{
    public Item Item { get; set; }
    public Order Order { get; set; }
    public bool Show { get { return /*some condition*/; }
}

也许我误解了这个问题,但把属于一起的东西放在一起是个好习惯。您仍然可以有多个ItemOrderContainer对象引用相同的Item.

于 2013-02-01T15:17:33.487 回答