1

过滤他们的列表我想显示的自跟踪表格上entities,使用标准的装订机构的列表。显示自跟踪实体,由状态

我要的是从列表中选择,修改/添加或删除它们,然后要么提交更改的entites或拒绝它们取决于用户的选择。

据我所知,为了这个entities的名单应该附加到上下文,然后接受更改调用应该作出(或不,如果更改将被拒绝)。这意味着删除的实体也必须在列表中,标记为已删除。

但是,它们不应再显示。这意味着显示应该根据实体的状态进行过滤。

现在,平时要多做过滤我将包装在BindingList我的列表,并使用Filter属性。另一方面,entites不会立即暴露他们的状态(不像输入的数据行)并将它们保存在ChangeTracker.State中。我很茫然,在这种情况下如何做过滤,特别是考虑到状态是一个枚举,而不是一个普通类型。

回答

0

经过一番商议,我发现BindingList不支持过滤,在技术上BindingSource也是如此。

所以,用标准筛选出题,我写我自己的实现,像这样:

private class LivingBindingList : BindingList<Producer> 
{ 
    public LivingBindingList(List<Producer> source) 
     : base(source.Where(producer => producer.ChangeTracker.State != ObjectState.Deleted).ToList()) 
    { 
     rem_cache = source.Where(producer => producer.ChangeTracker.State == ObjectState.Deleted).ToList(); 
    } 
    List<Producer> rem_cache; 
    protected override void RemoveItem(int index) 
    { 
     this.Items[index].MarkAsDeleted(); 
     this.rem_cache.Add(this.Items[index]); 
     base.RemoveItem(index); 
    } 
    protected override void OnAddingNew(AddingNewEventArgs e) 
    { 
     e.NewObject = new Producer() 
     { 
      NameProducer = "Новый производитель", 
      GUID = Guid.NewGuid(), 
      Type = 1, 
      Note = String.Empty 
     }; 
     base.OnAddingNew(e); 
    } 
    internal IEnumerable<Producer> GetAllForSubmit() 
    { 
     return this.Items.Concat(rem_cache); 
    } 
} 

有了这个,我可以绑定到列表,添加和删除,就像我想,和OFR提交目的通过GetAllForSubmit()检索所有记录,包括死亡记录。

1

[编辑:包括在删除实体从名单中删除第一个解决方案]

您可以添加一个属性请将isDeleted你的实体

public bool IsDeleted 
{ 
    get { 
     return ChangeTracker.State == ObjectState.Deleted 
    } 
} 

和过滤该财产。 STE是部分类别,可能会延长

+0

谢谢!你的回答给了我正确的方向 – Srv19 2013-03-22 13:36:59