2013-05-21 43 views
1

我有3个表:将数据添加到数据绑定的DataGridView(的WinForms,C#)

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我遇到的问题,因为I型的订单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方法,因为用户可能编辑后按CancelButton /添加顺序。

回答

0

要么使用BindingSource和添加项目(将自动更新DataGridView绑定到(tutorial)或添加后重新绑定数据源:

首先::

编辑
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);

+0

检查我的编辑,不要在这里使用匿名类型,你应该没问题。 – gzaxx

+0

你的意思是让一些OrderItemDisplayObject包含ItemId,ItemName,Quantity和Price的属性,然后用OrderItem和Item表中的数据设置它们? – Lahey

相关问题