2013-05-21 161 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

相關問題