我目前正试图找出使用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;
保存上下文会导致保存单个记录,但网格上会出现多行。在到达行尾并且验证行之后出现第二行。
如果有人能够指出我出错的地方,误解了它应该如何工作等等,那么第二行不会出现在网格上,我将不胜感激。
看起来好像FocusRowHandle从未在此配置中初始化。