向数据绑定DataGridView添加数据(WinForms, c#)



我有3个表:

Order (OrderId, columnXY ..)
OrderItem (OrderId, ItemId, Quantity)
Item (ItemId, Name, Price)

订单表绑定到一个DataGridView。在为订单dgv更改选择时,将像这样填充orderedItem dgv:

view.GetOrderedItemDataGridView().DataSource = dataContext.OrderItemSet.Where(o => o.OrderId == orderId).Select(o => new { o.Item.Id, o.Quantity, o.Item.Price }).ToList();

当按下AddItemButton时,打开一个对话框来选择一个项目,之后该项目应添加到orderedItem dgv:

using (var form = new OrderItemView(dataContext.ItemSet.ToList()))
{
    if (form.ShowDialog() == DialogResult.OK)
    {
        // Add selected item from OrderItemView to orderedItem dgv
    }
    else
    {
    }
}

更改应该稍后保存,通过单击SaveOrderButton,或通过单击CancelOrderButton取消。

void view_SaveOrderClicked(object sender, EventArgs e)
{
    // Get order data
    int customerId = Convert.ToInt32(view.OrderCustomerID);
    order.CustomerId = customerId;
    order.Weight = Convert.ToDouble(view.OrderWeight);
    order.Sum = Convert.ToDecimal(view.OrderSum);
    order.Date = view.OrderDate;
    order.AddressId = dataContext.AddressSet.Where(c => c.CustomerId == customerId && c.IsDeliveryAddress == true)
                                                .Select(a => a.Id).SingleOrDefault();
    if (!orderUpdateMode)
    {
        dataContext.OrderSet.Add(order);
    }
    else
    {
        dataContext.Entry(order).State = EntityState.Modified;
    }
    dataContext.SaveChanges();
}

我不知道如何添加一个新的项目到dgv,因为我不能直接添加行到数据绑定dgv。此外,我正在使用匿名类型填充dgv,因此我不能使用类属性作为添加新项的数据源。我是否应该创建一个新对象来填充dgv,只使用我想要显示的属性?我正在按照现在的方式检索数据,以便仅将某些列添加到orderedItem dgv.

我该如何解决这个问题?

干杯!

编辑:

当使用BindingSource时,我遇到了问题,因为我在Order dgv的OnSelectionChanged事件方法中获得的类型…

orderedItemsBS.DataSource = dataContext.OrderItemSet.Where(o => o.OrderId == orderId).
Select(o => new { o.Item.Id, o.Item.Name, o.Quantity, o.Item.Price }).ToList();

与我选择orderItem后得到的不一样:

void view_NewOrderItemClicked(object sender, EventArgs e)
{
    using (var form = new OrderItemView(dataContext.ItemSet.ToList()))
    {
        if (form.ShowDialog() == DialogResult.OK)
        {
            var item = new { Id = form.Item.Id, Name = form.Item.Name, Quantity = form.Quantity, Price = form.Item.Price };
            orderedItemsBS.Add(item);
            view.GetOrderedItemDataGridView().DataSource = orderedItemsBS;
        }
    }
}

另外,我不想在NewOrderItemClicked方法中保存任何东西到db,因为用户可能在编辑/添加订单后按下CancelButton。

使用BindingSource并向其添加项目(将自动更新绑定到(教程)的DataGridView)或添加后重新绑定数据源:

view.GetOrderedItemDataGridView().DataSource = null; 
view.GetOrderedItemDataGridView().Rows.Clear();
view.GetOrderedItemDataGridView().DataSource = dataContext.OrderItemSet.Where(o => o.OrderId == orderId).Select(o => new { o.Item.Id, o.Quantity, o.Item.Price }).ToList();
编辑后

:

首先:不要使用匿名类型,创建普通类并使用它。

第二:

view.GetOrderedItemDataGridView().DataSource = orderedItemsBS;

不需要这一行,而是添加:orderedItemsBS.ResetBindings(false);