我有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。
答案 0 :(得分:0)
使用BindingSource
并向其中添加项目(将在添加后自动更新绑定到tutorial的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);