【问题标题】:WPF DataGrid how to increase quantity column instead of adding duplicate rowWPF DataGrid如何增加数量列而不是添加重复行
【发布时间】:2018-07-25 07:56:43
【问题描述】:

我有这个“餐厅账单”的任务需要 DataGrid。

如果客户添加了相同的商品,而不是添加重复的行,我需要将 Quantity 列更新 1。

在上图中,当我再次点击Seafood Alfredo时,数量变为2,但又增加了一行Seafood Alfredo。我该如何防止这种情况发生?

将项目添加到数据网格的代码

private void cbbxMainCourse_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        //Populate DataGrid with item selected from combobox
        MainCourse selectedMainCourse = (MainCourse)cbbxMainCourse.SelectedItem;

        //DataGrid dgDishes add that item
        dgDishes.Items.Add(selectedMainCourse);
        selectedMainCourse.Quantity = 0;

        //Iterate through dgDishes and increase Quantity by 1 for duplicate item
        foreach (var item in dgDishes.Items)
        {
            if (item == selectedMainCourse)
            {
                selectedMainCourse.Quantity ++;
            }
        }
    }

编辑 1:

对于数据网格

<DataGrid ItemsSource="{Binding}" Width="400" Height="200" Margin="58.5, 100, 58.5, 0" x:Name="dgDishes" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
            <DataGridTextColumn Header="Category" Binding="{Binding Category}"/>
            <DataGridTextColumn Header="Price" Binding="{Binding Price}"/>
            <DataGridTextColumn Header="Quantity" Binding="{Binding Quantity}"/>
        </DataGrid.Columns>
    </DataGrid>

主菜

public class MainCourse : INotifyPropertyChanged
//: INotifyPropertyChanged
{
    public string Name { get; set; }
    public string Category { get; set; }
    public double Price { get; set; }
    //public int Quantity { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, e);
        }
    }
    private int _quantity;
    public int Quantity
    {
        get { return _quantity; }
        set
        {
            _quantity = value;
            //NumOrdered = 1;
            OnPropertyChanged(new PropertyChangedEventArgs("Quantity"));
        }
    }
}

组合框

<ComboBox x:Name="cbbxMainCourse" Margin="40,40,40,240" Width="400" Height="30" SelectionChanged="cbbxMainCourse_SelectionChanged">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Name}"></TextBlock>
                </StackPanel>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

【问题讨论】:

  • 数据仅在网格或数据库中@Psycho Li

标签: c# wpf visual-studio xaml datagrid


【解决方案1】:
if(!dgDishes.Items.Contains(selectedMaincourse))
    dgDishes.Items.Add(selectedMainCourse);
else
    selectedMainCourse.Quantity++;

如果集合已经存在,请不要添加到集合中。如果该项目已经存在于 dgDishes 中,只需迭代 selectedMainCourse 的 Quantity 属性

了解您为 dgDishes 使用的数据结构也很有帮助

【讨论】:

  • 迭代选择主课是什么意思?我们不是刚刚更新了数量吗?
  • 好吧,您正在迭代“selectedMainCourse”,这似乎更新了该特定项目的数量。您也可以按照 Michael Sanderson 所说的做,并使用 Linq dgDishes.Items.First(dish =&gt; dish.Name == selectedMainCourse.Name).Quantity++; 选择要迭代的项目问题是我不知道 MainCourse 类是如何实现的,也不知道 cbbxMainCourse 成员是什么所以我无法确定如何准确地更新项目的数量。但看起来只是迭代 selectedMainCourse 的 Quantity 属性就可以了(迭代意味着“添加到”)
  • 我还编辑了我的原始答案以使其更清晰
【解决方案2】:

您正在将 selectedMainCourse 添加到数据网格中,而不检查该元素是否已经存在。你可以试试这样的:

if (dgDishes.Items.All(dish => dish.Name != selectedMainCourse.Name)) {
    selectedMainCourse.Quantity = 1;
    dgDishes.Items.Add(selectedMainCourse);
}
else {
    dgDishes.Items.First(dish => dish.Name == selectedMainCourse.Name).Quantity++;

这样你要么添加一个数量为 1 的新菜,要么增加已经存在的菜的数量。

当然,我的答案是使用 LINQ 发布的,但是您可以通过将 All 和 First 调用解构为带有比较的 for 循环来创建类似的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 2015-04-06
    • 1970-01-01
    相关资源
    最近更新 更多