从我的列表框中删除重复项,然后使用重复次数再次添加

时间:2014-04-16 21:56:40

标签: c# sql winforms

我正在建立一个销售点系统。我使用FlowLayoutPanel为我的产品创建按钮。因此,一旦我点击该按钮,它就会将产品转移到listbox。现在我不知道如何输入该产品的数量?

我试着制作一个带有数字的表格(比如计算器),当我按下按钮时,它弹出但我不能。所以现在我有了这个想法,例如,如果我点击某个产品的按钮两次,而不是在listbox中将它放两次,而是将它放在一次,并将2放在数量列中。

所以我想我需要某种循环,每次单击该按钮时都会循环。这可能吗?

请帮助我,任何想法或意见都非常感谢。提前谢谢。

这是关于'ListBox'的所有代码:

public RegisterForm()
    {
        InitializeComponent();

        this.WindowState = FormWindowState.Maximized;
        ChosenProductsList.DataSource = products;
        ChosenProductsList.DisplayMember = "Name";

        CreateTappedPanel();
        AddProdToTapPanel();
    }

void UpdateProductList (object sender, EventArgs e)
    {            
        Button b = (Button)sender;                           
        ProductTBL p = (ProductTBL)b.Tag;                   

        products.Add(p);
        ChosenProductsList.SelectedIndex = ChosenProductsList.Items.Count - 1;                   
    }

private void FormatListItem(object sender, ListControlConvertEventArgs e)
    {
        string CurrentName = ((ProductTBL)e.ListItem).Name;
        string currentPrice = String.Format("{0:c}", ((ProductTBL)e.ListItem).Price);
        string currentNamePadded = CurrentName.PadRight(20);

        e.Value = currentNamePadded + currentPrice;
    }

2 个答案:

答案 0 :(得分:0)

使用LINQ,您可以使用Distinct()Select()Count()方法轻松实现这一目标:

示例:

internal class VideoGame
{
    public string Name { get; set; }
}

var game1 = new VideoGame {Name = "MegaMan"};
var game2 = new VideoGame {Name = "Super Mario Bros"};
var game3 = new VideoGame {Name = "Kirby"};

var list = new List<VideoGame>();
list.Add(game1);
list.Add(game2);
list.Add(game2);
list.Add(game3);
list.Add(game3);
list.Add(game3);

IEnumerable<VideoGame> videoGames = list.Distinct();
var enumerable = videoGames.Select(s => new {VideoGame = s, Count = list.Count(t => t.Name == s.Name)});

现在我将enumerable转换为字符串,以便您可以看到结果:

var @join = string.Join(Environment.NewLine, enumerable.Select(s => string.Format("VideoGame: {0}, Count: {1}", s.VideoGame.Name, s.Count)));

输出:

VideoGame: MegaMan, Count: 1
VideoGame: Super Mario Bros, Count: 2
VideoGame: Kirby, Count: 3

请注意,我使用的是anonymous type,但您可以使用自己的类型。

我告诉你更新ListBox的任务,应该很容易做到:D

答案 1 :(得分:0)

使用列表框,它的一个主要优点是它将接受任何对象作为项目。这意味着您可以创建自己的对象,覆盖ToString方法以显示所需的数据,如果您想要返回所选项,则只需将其转换回原始类型。

public class Item
{
    public string name = "";
    public int count = 0;
    public override string ToString()
    {
        return name;
    }
}

创建Item

列表
List<Item> items = new List<Item>()
{
    new Item{name = "A", count = 1},
    new Item{name = "B", count = 1},
};

填充列表框。使用ToString方法

listbox1.DataSource = items;

要增加计数,请找到Items集合中的项目,将其强制转换为Item并增加count属性 使用所选项目

Item pickeditem = (Item)listbox1.SelectedItem;