0

嗨,我有一个包含产品的自定义 BindingList,其中包含以下信息

string ProductID
int Amount;

我如何才能做到以下几点。

ProductsList.Add(new Product("ID1", 10));
ProductsList.Add(new Product("ID2", 5));
ProductsList.Add(new Product("ID2", 2));

该列表应包含 2 个产品

ProductID = "ID1"   Amount = 10
ProductID = "ID2"   Amount = 7;

所以它有点像购物车

我正在查看 AdditionalNew 事件并覆盖 void InsertItem(int index, T item)

但我真的需要一点帮助才能开始

4

2 回答 2

1

我真的不知道你为什么需要这个自定义列表,因为 .net 库中有很多很好的集合,但我在下面尝试了一些东西。

 public class ProductList
{
   public string ProductID {get;set;}
   public int Amount {get;set;}
}

public class MyBindingList<T>:BindingList<T> where T:ProductList
{

    protected override void InsertItem(int index, T item)
    {

        var tempList = Items.Where(x => x.ProductID == item.ProductID);
        if (tempList.Count() > 0)
        {
           T itemTemp = tempList.FirstOrDefault();
           itemTemp.Amount += item.Amount;


        }
        else
        {
            if (index > base.Items.Count)
            {
                base.InsertItem(index-1, item);
            }
            else
                base.InsertItem(index, item);

        }

    }

    public void InsertIntoMyList(int index, T item)
    {
        InsertItem(index, item);
    }



}

并在您可以使用此列表的客户端代码中。

        ProductList tempList = new ProductList() { Amount = 10, ProductID = "1" };
        ProductList tempList1 = new ProductList() { Amount = 10, ProductID = "1" };
        ProductList tempList2 = new ProductList() { Amount = 10, ProductID = "2" };
        ProductList tempList3 = new ProductList() { Amount = 10, ProductID = "2" };

        MyBindingList<ProductList> mylist = new MyBindingList<ProductList>();

        mylist.InsertIntoMyList(0, tempList);
        mylist.InsertIntoMyList(1, tempList1);
        mylist.InsertIntoMyList(2, tempList2);
        mylist.InsertIntoMyList(3, tempList);
        mylist.InsertIntoMyList(4, tempList1);
        mylist.InsertIntoMyList(0, tempList3);
于 2010-11-17T14:58:56.923 回答
1

创建自己的集合很少是正确的选择——在这种情况下,我更倾向于包含而不是继承。就像是

class ProductsList
{
    private readonly SortedDictionary<string, int> _products 
                                   = new Dictionary<string,int>();

    public void AddProduct(Product product)
    {
        int currentAmount;
        _products.TryGetValue(product.ProductId, out currentAmount);

        //if the product wasn't found, currentAmount will be 0
        _products[product.ProductId] = currentAmount + product.Amount;
    }
}

评论:

  • 如果您需要实际的 IEnumerable(而不是字典),请使用KeyedCollection
  • 您可以为 编写一个扩展方法,而不是创建自己的类(这会迫使您实现所需的所有方法),IEnumerable<Product>例如AddProduct- 但这不会隐藏常规Add方法,我猜这更像是一种快速而肮脏的方式做它

最后,不要担心这IBindingList部分 - 你总是可以使用BindingSource

于 2010-11-17T19:12:29.737 回答