Как отличить новые строки в сетке данных от существующих? - PullRequest
0 голосов
/ 07 июня 2018

У меня есть обычная DataGrid в приложении WPF, которая поддерживается ObservableCollection<T>.Я обновляю базу данных SQL Server, используя Dapper.

Dapper может обновлять существующие записи без проблем, но чтобы получить новые записи в базе данных, я должен вставить их.Поэтому я должен сделать два звонка Dapper;один для обновления любых изменений, внесенных пользователем в существующие записи, и один для добавления любых новых записей.

Как отличить записи в ObservableCollection, которые были добавлены пользователем, от оригинальных, которыебыли загружены из базы данных при загрузке формы?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Вы можете сэкономить прослушивание событий.Просто выполните инициализацию по умолчанию для новых записей с другим значением, как для существующих.

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;
    }
}
0 голосов
/ 08 июня 2018

Предполагая, что 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));
}
...