Как мягко удалить с WPF DataGrid и Entity Framework? - PullRequest
1 голос
/ 16 февраля 2012

Предположим, у меня есть следующая таблица:

CREATE TABLE EXAMPLETABLE (
     ID NUMBER(10,0) NOT NULL,
     DELETIONDATE DATE, 
     NAME VARCHAR2(100 CHAR) NOT NULL, 
     UNIQUE (DELETIONDATE, NAME));

Как программно удалить элемент из WPF DataGrid?Мягкое удаление - операция ниже:

UPDATE EXAMPLETABLE 
SET DELETIONDATE = NOW()
WHERE ID = SOMEID;

Должен ли я обрабатывать событие KeyPress?В форме у меня есть кнопка Сохранить, нужно ли мне пройти процедуру перед вызовом entities.SaveChanges()?

1 Ответ

2 голосов
/ 16 февраля 2012

Вы не предоставили много информации о том, как вы используете сетку данных, поэтому мне придется сделать некоторые предположения.

Если вы хотите, чтобы «мягкое удаление» происходило, когда пользователь удаляет строку из сетки данных, вам нужно разрешить удаление строк. Вы делаете это, устанавливая CanUserDeleteRows в True.

Я предполагаю, что вы используете какую-то привязку данных для связывания строк в сетке данных. При удалении строки базовый объект в ItemsSource удаляется из этой коллекции. Если вы используете коллекцию, реализующую INotifyCollectionChanged (например, ObservableCollection), событие происходит, когда это происходит.

Вы можете прослушать это событие и соответствующим образом изменить базовый объект модели, установив для DeletionDate значение DateTime.Now. Затем вам нужно будет позвонить entities.SaveChanges(), чтобы отправить это изменение в базу данных.

private void ReloadData()
{
    var viewSource = (CollectionViewSource)this.FindResource("aTableViewSource");
    var aTableRows = new ObservableCollection<aTable>
    (
        this.entities.aTable
            .Where(fibra => !fibra.DELETIONDATE.HasValue)
            .Take(10)
            .ToList()
    );

    fibras.CollectionChanged += EventHandler;
    fibrasViewSource.Source = aTableRows;
}

void EventHandler(object sender, NotifyCollectionChangedEventArgs e)
{
    if (e.Action == NotifyCollectionChangedAction.Remove)
    {
        foreach(var oldItem in e.OldItems)
        {
            ((aTable)oldItem).DELETIONDATE = DateTime.Now;
        }
    }
}
...