如何区分数据网格中的新行与现有行?

时间:2018-06-07 20:36:21

标签: c# wpf observablecollection dapper dapper-contrib

我在一个由ObservableCollection<T>支持的WPF应用程序中有一个普通的DataGrid。我正在使用Dapper更新SQL Server数据库。

Dapper可以毫无问题地更新现有记录,但是要将新记录添加到数据库中,我必须插入它们。所以我必须打两个Dapper电话;一个用于更新用户对现有记录所做的任何更改,另一个用于添加任何新记录。

如何区分用户添加的ObservableCollection中的记录与表单加载时从数据库中加载的原始记录?

2 个答案:

答案 0 :(得分:1)

您可以免费收听事件。只需使用另一个值为新记录进行默认初始化。

public class Document
{
    static bool IsNewInitializer { get; set; } = false;

    int Id { get; set; }
    string DocumentName { get; set; }
    bool IsNew { get; set; } = IsNewInitializer; // This field is not in the database
}

public void LoadDocuments()
{
    Document.IsNewInitializer = false;

    var documents = myIdbConnection.GetAll<Document>();
    Documents = new ObservableCollection<Document>(documents);

    Document.IsNewInitializer = true;
}
public void Save()
{
    myIdbConnection.Update(Documents.Where(x => !x.IsNew));
    myIdbConnection.Insert(Documents.Where(x => x.IsNew));
    foreach (var d in Documents.Where(x => x.IsNew))
    {
        d.IsNew = false;
    }
}

答案 1 :(得分:0)

假设DTO为

public class Document
{
    int Id { get; set; }
    string DocumentName { get; set; }
    bool IsNew { get; set; } // This field is not in the database
}

我可以使用此事件处理程序:

private void Documents_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
    foreach(Document item in e.NewItems)
    {
        item.IsNew = true;
    }
}

标记用户添加到数据网格的任何新记录。我在加载数据库中的原始记录后挂钩此处理程序

public void LoadDocuments()
{
    var documents = myIdbConnection.GetAll<Document>();         
    Documents = new ObservableCollection<Document>(documents);
    Documents.CollectionChanged += Documents_CollectionChanged;
}

然后:

public void Save()
{
    myIdbConnection.Update(Documents.Where(x=>!x.IsNew));
    myIdbConnection.Insert(Documents.Where(x=>x.IsNew));
}