【问题标题】:Adding data to data bound DataGridView (WinForms, C#)将数据添加到数据绑定 DataGridView (WinForms, C#)
【发布时间】:2013-05-21 09:07:10
【问题描述】:

我有 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 方法中将任何内容保存到数据库中,因为用户可能会在编辑/添加订单后按下 CancelButton。

【问题讨论】:

    标签: c# winforms entity-framework


    【解决方案1】:

    要么使用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);

    【讨论】:

    • 检查我的编辑,这里不要使用匿名类型,你应该没问题。
    • 您的意思是制作一些包含 ItemId、ItemName、Quantity 和 Price 属性的 OrderItemDisplayObject,然后使用 OrderItem 和 Item 表中的数据进行设置?
    猜你喜欢
    • 1970-01-01
    • 2019-07-21
    • 2015-12-02
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    相关资源
    最近更新 更多