Как откатить изменения в элементе управления WPF DataGrid с помощью LINQ-to-SQL? - PullRequest
5 голосов
/ 24 марта 2009

Я смог настроить WPF Datagrid, отобразить таблицу базы данных Northwind через linq-to-sql и обработать событие TheDataGrid_RowEditEnding, чтобы он сохранял базу данных.

Однако, когда CustomerID был изменен, он получает ошибку из базы данных, которую я обрабатываю, но как мне теперь (1) откатить элемент управления Datagrid или (2) повторно получить исходные данные из представления базы данных LINQ-to-SQL (повторное получение, которое я делаю ниже через LINQ, похоже, имеет какое-то кэширование, но не обновляет):

<Grid DockPanel.Dock="Bottom">
    <toolkit:DataGrid x:Name="TheDataGrid" 
                      AutoGenerateColumns="True"
                      RowEditEnding="TheDataGrid_RowEditEnding"/>
</Grid>



private void TheDataGrid_RowEditEnding(object sender, Microsoft.Windows.Controls.DataGridRowEditEndingEventArgs e)
{
    try
    {
        _db.SubmitChanges();
    }
    catch (Exception ex)
    {
        RefreshData();
        Message.Text = ex.Message;
    }
}

public void RefreshData()
{
    var customers = from c in _db.Customers
                    select c;
    TheDataGrid.ItemsSource = customers;
}

ОТВЕТ:

Спасибо, Денис, я воспользовался твоими предложениями, чтобы получить то, что мне было нужно:

private void TheDataGrid_RowEditEnding(object sender, Microsoft.Windows.Controls.DataGridRowEditEndingEventArgs e)
{
    try
    {
        _db.SubmitChanges();
    }
    catch (Exception ex)
    {
        Customer customer = e.Row.Item as Customer;
        _db.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, customer);
        Message.Text = ex.Message;
    }
}

1 Ответ

3 голосов
/ 24 марта 2009

Прежде всего, необходимо ли менять идентификатор клиента? Если это приводит к ошибке, я думаю, что это не так, поэтому вы должны пометить этот столбец как ReadOnly (IsReadonly = "True", я считаю).

Во-вторых, если вам нужно обновить объект из базы данных, вам нужно вызвать функцию Refresh () для текста данных, передавая ваш объект в качестве параметра. Это отзовет текущие значения из базы данных.

В-третьих, для редактирования и отката всего объекта DataGrid поддерживает интерфейс IEditableObject, который позволяет объекту предоставлять локальные методы, подобные транзакциям (в основном он создает внутренние копии данных при каждом вызове BeginEdit и может отменить меняется при необходимости). Это все ручной процесс, но это интерфейс, который долгое время существовал в Windows Forms, если я не ошибаюсь, и вы должны быть в состоянии найти тонны информации об этом (или кто-то лучше, чем я, может дать здесь вам несколько примеров).

Вы можете реализовать этот интерфейс на своих объектах (через частичные классы, поскольку ваши объекты являются классами LinqToSQL, предположительно сгенерированными конструктором).

Вот статья о DataGrid и некоторых опциях, которые у вас есть. Он немного староват, но может дать вам еще несколько советов. Здесь - другой, более короткий.

Кстати, проверьте WPF toolkit еще раз, они только что выпустили новую версию (мартовская версия 2009), которая может иметь больше поддержки для редактирования / проверки, чем она использовала тоже.

...