WPF DataGrid如何增加数量列而不是添加重复行

时间:2018-02-14 16:51:59

标签: c# wpf visual-studio xaml datagrid

我有"餐厅条例草案"需要DataGrid。

如果客户添加相同的商品,而不是添加重复的行,我需要将数量列更新为1.

DataGrid populated by combobox

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

将项目添加到datagrid的代码

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

<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>

2 个答案:

答案 0 :(得分:1)

if(!dgDishes.Items.Contains(selectedMaincourse))
    dgDishes.Items.Add(selectedMainCourse);
else
    selectedMainCourse.Quantity++;

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

了解您用于dgDishes的数据结构

也很有帮助

答案 1 :(得分:1)

您正在将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循环来进行比较来创建类似的行为。