簡體   English   中英

顯示自我跟蹤實體列表,按狀態過濾它們

[英]Displaying list of self-tracking entities, filtering them by state

我想使用標准綁定機制在表單上顯示自跟蹤entities的列表。

我想要的是從列表中選擇實體,更改/添加或刪除它們,然后根據用戶選擇提交更改或拒絕它們。

據我了解,對於entities列表應該附加到上下文的情況,則應該進行一個接受更改調用(或者,如果要拒絕更改,則不進行)。 這意味着刪除的實體也必須在列表中,並標記為已刪除。

但是,不應再顯示它們。 這意味着顯示應按實體狀態過濾。

現在,通常要進行過濾,我將列表包裝在BindingList並使用Filter屬性。 另一方面,實體不會立即暴露其狀態(與鍵入的數據行不同),而不會將它們保存在ChangeTracker.State 我很茫然,在這種情況下如何進行過濾,尤其是考慮到狀態是一個枚舉,而不是普通類型。

[編輯:刪除了從列表中刪除實體組成的第一個解決方案]

您可以將IsDeleted屬性添加到您的實體

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

並對該屬性進行過濾。 STE是局部類,可以擴展

經過深思熟慮,我發現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);
    }
}

這樣,我可以綁定到列表,根據需要添加和刪除任意數量,並且出於提交目的,可以使用GetAllForSubmit()檢索所有記錄,包括失效的記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM