【问题标题】:Displaying separate items in a listbox from a collection在集合中的列表框中显示单独的项目
【发布时间】:2014-01-14 15:04:34
【问题描述】:

我正在制作一个购物篮 winforms 应用程序,它将接受用户的输入,用户将指定产品名称、价格和数量。

我有一个 dll,其中包含一些与应用程序相关的方法和一个创建列表的构造函数 - 我已经在我的 winforms 代码中实例化了它。

我遇到的问题是我无法在列表框中分隔不同的产品,它会替换用户输入的上一个项目,例如它目前的内容是:

Product     Price      Quantity
Bread       3.60       3
Milk        6.57       5
Eggs        8.97       7
Bread       11.37      9

我想在哪里阅读:

Product     Price      Quantity
Bread       6.00       5
Milk        1.19       2
Eggs        1.50       2

我希望它单独显示每件商品,以及相应的价格和当前数量。

我尝试使用foreach 循环遍历购物篮,但出现错误:

foreach 语句不能对类型变量进行操作 'namespace.ShoppingBasket' 因为'namespace.ShoppingBasket' 没有 包含“GetEnumerator”的公共定义

我应该使用接口来实现这一点吗?

【问题讨论】:

    标签: c# winforms listbox


    【解决方案1】:

    您的ShoppingBasket 类没有实现接口IEnumerable,如果您想枚举foreach 中的篮子,这是必需的。如果您不想从头开始实现该接口,您可以从已经实现它的某个类继承(例如List<T>)。

    例如如果您将订单项存储在列表中,则可以返回它的枚举数:

    public class ShoppingBasket : IEnumerable<OrderItem>
    {
        private List<OrderItem> items = new List<OrderItem>();
    
        // ...
    
        public IEnumerator<OrderItem> GetEnumerator()
        {
            return items.GetEnumerator();
        }
    
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }
    

    注意:你也可以只添加IEnumerator GetEnumerator() 方法而不是实现IEnumerable 接口。这也将使foreach 工作。

    【讨论】:

    • 我没有丰富的接口经验,我知道如何实现它,但是我应该用什么代替throw new NotImplementedException();谢谢!
    • @RayB151 这取决于您的 ShoppingBasket 类实现。可以展示一下吗?
    • 希望我理解正确,您是这个意思吗? IEnumerator&lt;OrderItem&gt; IEnumerable&lt;OrderItem&gt;.GetEnumerator()
    • @RayB151 抱歉,不知道您的代码是什么意思,但是如果您想将您的购物篮视为订单项目的序列,它应该实现 IEnumerable&lt;OrderItem&gt;(这意味着实现 GetEnumerator 方法)
    • 确实有效!我确实还有一些问题需要解决,但已经完成了,非常感谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多