Использование winforms с источником привязки. Как узнать, изменил ли пользователь запись?
У меня есть обязательный навигатор с источником привязки в форме winforms. Мой источник данных взят из списка структур сущностей.
Я хочу отслеживать состояние каждой сущности в моем обязательном источнике, используя технику, которую я изучил на курсе Джулии Лерман в Pluralsight.
Добавление и редактирование достаточно просты, я просто заполнил события кнопки "Добавить" и "Удалить"
private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e)
{
((IEntity)(this.personBindingSource.Current)).State = EntityState.Added;
}
private void bindingNavigatorDeleteItem_Click(object sender, EventArgs e)
{
((IEntity)(this.personBindingSource.Current)).State = EntityState.Deleted;
}
Однако нет события EditItemClick. Как я могу отслеживать, был ли объект изменен?
Заметьте, что я привязываюсь к отключенному списку доменного класса.
List<Person> people = MyRepository.GetPeople();
this.personBindingSource.DataSource =people;
this.personBindingNavigator.BindingSource = this.personBindingSource;
У меня есть интерфейс IENtity
public interface IEntity
{
EntityState State { get; set; }
}
public enum EntityState
{
Unchanged,
Added,
Modified,
Deleted
}
и Person наследует от этого [Update], просматривая свойства события bindingSource, я вижу, что CurrentItemChanged вызывается при изменении свойства. Однако оно также возникает, когда изменяется текущий элемент.
Есть ли способ выяснить, по какой причине он был поднят?
2 ответа
private void bindingSource_ListChanged(object sender, ListChangedEventArgs e)
{
if (e.ListChangedType == ListChangedType.ItemChanged)
{
var entity = (IEntity)((BindingSource)sender).Current;
if (entity.State == EntityState.Unchanged)
{
entity.State = EntityState.Modified;
}
}
}
Поскольку ваши объекты отключены, отслеживание изменений по контексту недоступно, поэтому вам нужно отслеживать изменения самостоятельно.
Если вы измените метод репозитория для создания клонов людей, которых вы извлекаете, мы можем повторно соединить исходные объекты в момент сохранения.
List<Person> originalPeople;
List<Person> modifiablePeople = MyRepository.GetPeople(out originalPeople);
Вы можете прочитать раздел Создание клонированного объекта, содержащего текущие, оригинальные значения или значения базы данных, чтобы узнать, как создать клон из ваших оригинальных объектов людей.
MyRepository.SavePeople будет принимать два аргумента: originalPeople (клоны) и modifiablePeople (измененные люди, связанные с пользовательским интерфейсом, содержащим изменения). Затем вы снова присоедините свой originalPeople в неизмененном состоянии, а затем примените изменения свойств от измененного человека итеративным способом:
var entry = context.Entry(original Person);
entry.CurrentValues.SetValues(modifiedPerson);
Прочтите раздел " Установка текущих или исходных значений из другого объекта".