C# 从我的列表框中删除重复项,并使用重复数再次添加
我正在建立一个销售点系统。我使用了一个为我的产品创建按钮的C# 从我的列表框中删除重复项,并使用重复数再次添加,c#,sql,winforms,C#,Sql,Winforms,我正在建立一个销售点系统。我使用了一个为我的产品创建按钮的FlowLayoutPanel。因此,一旦我点击该按钮,它就会将产品转移到一个列表框。现在我被困在如何输入该产品的数量上了 我试着用数字做一个表格(比如计算器),当我按下按钮时,它会弹出,但我做不到。所以现在我有了这样一个想法,如果我点击某个产品的按钮两次,比如说,而不是把它两次放在列表框中,它会把它放一次,然后把2放在数量列中 所以我想我需要一个循环,每次我点击这个按钮都会循环。可能吗 请帮助我,任何想法或意见都非常感谢。提前谢谢 这是
FlowLayoutPanel
。因此,一旦我点击该按钮,它就会将产品转移到一个列表框
。现在我被困在如何输入该产品的数量上了
我试着用数字做一个表格(比如计算器),当我按下按钮时,它会弹出,但我做不到。所以现在我有了这样一个想法,如果我点击某个产品的按钮两次,比如说,而不是把它两次放在列表框中,它会把它放一次,然后把2放在数量列中
所以我想我需要一个循环,每次我点击这个按钮都会循环。可能吗
请帮助我,任何想法或意见都非常感谢。提前谢谢
这是有关“列表框”的所有代码:
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,您可以通过以下方法轻松实现这一点:
例如:
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)});
输出:
VideoGame: MegaMan, Count: 1
VideoGame: Super Mario Bros, Count: 2
VideoGame: Kirby, Count: 3
请注意,我使用了,但您可以使用自己的类型
我留给您更新列表框的任务,应该是相当容易的:使用列表框,它的主要优点之一是它可以接受任何对象作为项目。这意味着您可以创建自己的对象,重写ToString方法以显示所需的数据,如果希望返回所选项目,只需将其转换回原始类型即可
public class Item
{
public string name = "";
public int count = 0;
public override string ToString()
{
return name;
}
}
创建项目的列表
List<Item> items = new List<Item>()
{
new Item{name = "A", count = 1},
new Item{name = "B", count = 1},
};
要增加计数,请在Items集合中查找项目,将其强制转换为item
,并增加count属性
使用所选项目的步骤
Item pickeditem = (Item)listbox1.SelectedItem;
这应该很容易。您可以迭代列表框
的项
成员,并操作您要查找的项,前提是删除项后不再继续查找。或者,如果您有房地产,您可能更喜欢使用带有自定义控件的StackPanel
来执行类似web购物车(或本页右侧的相关列)的操作。@JohnC这是Winforms,不是WPF。很抱歉,我没有指定它是winforms。请查看问题的外观,并通过提高可读性来改进它。我们让我们的代码看起来井然有序、美观,为什么不在我们提问时遵循这个好传统呢?;)我尝试了你的答案,但它给出了错误。请检查我包含的代码,并告诉我如何使用你的答案。
listbox1.DataSource = items;
Item pickeditem = (Item)listbox1.SelectedItem;