Как отличить новые строки в сетке данных от существующих?
У меня есть обычная DataGrid в приложении WPF, которая поддерживается ObservableCollection<T>
, Я обновляю базу данных SQL Server, используя Dapper.
Dapper может обновлять существующие записи без проблем, но чтобы получить новые записи в базе данных, я должен вставить их. Поэтому я должен сделать два звонка Dapper; один для обновления любых изменений, внесенных пользователем в существующие записи, и один для добавления любых новых записей.
Как мне отличить записи в ObservableCollection
которые были добавлены пользователем из исходных, которые были загружены из базы данных при загрузке формы?
2 ответа
Принимая 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));
}
Вы можете сэкономить прослушивание событий. Просто сделайте инициализацию по умолчанию для новых записей с другим значением, как для существующих.
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;
}
}