从我的列表框中删除重复项,然后根据重复次数再次添加
本文关键字:添加 然后 列表 我的 删除 | 更新日期: 2023-09-27 17:58:37
我正在构建一个销售点系统。我使用了一个为我的产品创建按钮的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;
}
使用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
请注意,我使用了匿名类型,但您可以使用自己的类型。
我留给您更新ListBox的任务,应该很容易做到:D
使用listbox,它的主要优点之一是可以接受任何对象作为项。这意味着您可以创建自己的对象,覆盖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;