在实体框架结果中添加新行,在网格中重复行

时间:2015-02-08 06:31:32

标签: c# entity-framework devexpress

我目前正试图找出使用EF6.1处理向DevExpress网格添加新行的正确方法(应该注意它是基于ObjectContext而不是DbContext)。

我遇到的问题是我在网格控件上得到一个重复的行,并且看起来也在数据源中。

感兴趣的InitNewRow事件代码如下所示。

    private void ItemsGridView_InitNewRow(object sender, DevExpress.XtraGrid.Views.Grid.InitNewRowEventArgs e)
    {
        Log.DebugFormat("INITNEWROW RowHandle = {0} ColumnName = {1} ColumnValue = {2} IsNewRow {3} Grid Rows {4} Datasource Rows {5} Data Row Count {6}", 
            e.RowHandle, 
            ItemsGridView.FocusedColumn == null ? "NULL" : ItemsGridView.FocusedColumn.Name, 
            ItemsGridView.FocusedValue == null ? "NULL" : ItemsGridView.FocusedValue.ToString(),
            ItemsGridView.IsNewItemRow(e.RowHandle),
            ItemsGridView.RowCount,
            (dgItems.DataSource as BindingSource).List.Count,
            ItemsGridView.DataRowCount);

        Log.InfoFormat("Entering gvItems_InitNewRow {0}:{1}", e.RowHandle, ItemsGridView.FocusedRowHandle);
        Debug.Assert(e.RowHandle == ItemsGridView.FocusedRowHandle);
        if (ItemsGridView.IsNewItemRow(e.RowHandle))
        {
            var bindingSource = dgItems.DataSource as BindingSource;
            var item = bindingSource.Current as Item;

            // THIS NEXT LINE CAUSES THE ADDITION OF A NEW ROW IN THE GRID AND THE DATASOURCE
            item.Order = Context.Orders.Where(o => o.OrderID == OrderID).FirstOrDefault();

            dgItems.RefreshDataSource();
            Log.DebugFormat("INITNEWROW RowHandle = {0} ColumnName = {1} ColumnValue = {2} IsNewRow {3} Grid Rows {4} Datasource Rows {5} Data Row Count {6}",
                e.RowHandle,
                ItemsGridView.FocusedColumn == null ? "NULL" : ItemsGridView.FocusedColumn.Name,
                ItemsGridView.FocusedValue == null ? "NULL" : ItemsGridView.FocusedValue.ToString(),
                ItemsGridView.IsNewItemRow(e.RowHandle),
                ItemsGridView.RowCount,
                (dgItems.DataSource as BindingSource).List.Count,
                ItemsGridView.DataRowCount);

此代码生成以下跟踪

>     2015-02-08 16:10:24,171 [1] DEBUG NOES.Frm.OrdersDE INITNEWROW RowHandle = -2147483647 ColumnName = colProductID ColumnValue = NULL
> IsNewRow True Grid Rows 0 Datasource Rows 1 Data Row Count 0
>     
>     2015-02-08 16:10:24,171 [1] INFO  NOES.Frm.OrdersDE Entering gvItems_InitNewRow -2147483647:-2147483647
>     
>     2015-02-08 16:10:24,171 [1] INFO  NOES.Frm.OrdersDE ] NOES.Frm.OrdersDE::get_Context() executed in 0 milliseconds
>     
>     2015-02-08 16:10:24,179 [1] INFO  NOES.Frm.OrdersDE ] NOES.Frm.OrdersDE::get_OrderID() executed in 0 milliseconds
>     
>     2015-02-08 16:10:24,265 [1] INFO  NOES.Frm.OrdersDE ] NOES.Frm.OrdersDE::ItemsGridView_CalcPreviewText(Object
> sender,CalcPreviewTextEventArgs e) executed in 7 milliseconds
>     
>     2015-02-08 16:10:24,268 [1] INFO  NOES.Frm.OrdersDE ] NOES.Frm.OrdersDE::ItemsGridView_CalcPreviewText(Object
> sender,CalcPreviewTextEventArgs e) executed in 0 milliseconds
>     
>     2015-02-08 16:10:24,269 [1] INFO  NOES.Frm.OrdersDE ] NOES.Frm.OrdersDE::ItemsGridView_CalcPreviewText(Object
> sender,CalcPreviewTextEventArgs e) executed in 0 milliseconds
>     
>     2015-02-08 16:10:24,319 [1] DEBUG NOES.Frm.OrdersDE INITNEWROW RowHandle = -2147483647 ColumnName = colProductID ColumnValue = NULL
> IsNewRow True Grid Rows 1 Datasource Rows 2 Data Row Count 1
>     
>     2015-02-08 16:10:24,328 [1] INFO  NOES.Frm.OrdersDE ] NOES.Frm.OrdersDE::get_LastProduct() executed in 0 milliseconds
>     
>     2015-02-08 16:10:24,330 [1] INFO  NOES.Frm.OrdersDE ] NOES.Frm.OrdersDE::ItemsGridView_InitNewRow(Object
> sender,InitNewRowEventArgs e) executed in 160 milliseconds

从跟踪中可以看出,行和数据源值递增(使用调试器,它与items.Order = line隔离。

订单包含数据源初始化为的项目列表:

        this.OrderBindingSource.DataSource = CurrentOrder;

        dgItems.DataMember = null;
        var itemsBindingSource = new BindingSource(CurrentOrder, "Items");
        dgItems.DataSource = itemsBindingSource;

我原本觉得它与创建的项目是订单的子项这一事实有关,但是在向项目添加对产品的引用(使用相同的上下文)时会看到相同的效果。这也会导致将新行添加到网格和数据源中的效果相同。

无论是否是RefereshDataSource,都会发生这种情况。

以防万一,因此初始化CurrentOrder属性:

    private Order CurrentOrder
    {
        get
        {
            if (mCurrentOrder == null)
            {
                DataLoading = true;
                if (OrderID > 0)
                {
                    mCurrentOrder = Context.Orders
                        .Include(Order.EntityDeliveryPath)
                        .Include(Order.EntityItemName)
                        .Include(Order.EntityBatchPath)
                        .Include(Order.EntityItemPunchName)
                        .Include(Order.EntityNoteName)
                        .Include(Order.EntityOrderStatusName)
                        .Include(Order.EntityOrderDeliveryStatus)
                        .Where(o => o.OrderID == OrderID)
                        .Single();
                    OrderID = mCurrentOrder.OrderID;
                    CustomerId = mCurrentOrder.CustomerID??0;
                }
                else
                {
                    mCurrentOrder = Order.CreateOrder(
                        0,  // Will be set on save
                        GetNextOrderNum(), 
                        Context.OrderDeliveryStatus
                            .Where(s => s.Status.Equals("Not Batched"))
                            .Single()
                            .OrderDeliveryStatusID);
                    SetInitialDefaultValues(mCurrentOrder);
                }
                DataLoading = false;
            }
            return mCurrentOrder;
        }
        set
        {
            mCurrentOrder = value;
        }
    }
    private Order mCurrentOrder = null;

保存上下文会导致保存单个记录,但网格上会出现多行。在到达行尾并且验证行之后出现第二行。

What is on the screen

如果有人能够指出我出错的地方,误解了它应该如何工作等等,那么第二行不会出现在网格上,我将不胜感激。

看起来好像FocusRowHandle从未在此配置中初始化。

0 个答案:

没有答案