2009-03-24 7 views
5

J'ai été capable de configurer une base de données WPF, d'afficher une table de base de données Northwind via linq-to-sql et de gérer l'événement TheDataGrid_RowEditEnding afin de sauvegarder la base de données.Comment annuler les modifications apportées au contrôle WPG DataGrid à l'aide de LINQ-to-SQL?

Toutefois, lorsqu'un code client a été modifié, il reçoit une erreur de la base de données que je gère, mais comment puis-je maintenant (1) restaurer le contrôle Datagrid ou (2) restaurer les données d'origine de la vue de base de données LINQ -À-SQL (le refetching que je fais ci-dessous via LINQ semble avoir une sorte de mise en cache, il ne met pas à jour):

<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; 
} 

RÉPONSE:

Merci Denis, je vos suggestions obtenir ce que j'étais après:

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; 
    } 
} 

Répondre

3

Tout d'abord, est-ce une exigence de pouvoir changer le code client? Si cela génère une erreur, j'imagine que ce n'est pas le cas, donc vous devriez avoir cette colonne marquée comme ReadOnly (IsReadonly = "True" je crois). Deuxièmement, si vous devez actualiser un objet de la base de données, vous devez appeler Refresh() sur le datacontext, en passant votre objet en tant que paramètre. Cela retirera les valeurs actuelles de la base de données. Troisièmement, pour gérer l'édition et les restaurations sur l'objet entier, le DataGrid prend en charge l'interface IEditableObject, qui permet à un objet d'exposer des méthodes transactionnelles locales (essentiellement des copies internes des données à chaque appel de BeginEdit). les changements si nécessaire). Tout est un processus manuel, mais c'est une interface qui existe depuis longtemps dans Windows Forms si je ne me trompe pas, et vous devriez être capable de trouver des tonnes d'informations à ce sujet (ou quelqu'un de mieux que moi ici peut donner vous quelques exemples).

Vous pouvez implémenter cette interface sur vos objets (via des classes partielles, puisque vos objets sont des classes LinqToSQL, vraisemblablement générées par le concepteur).

Here's un article sur le DataGrid et quelques options que vous avez avec celui-ci. C'est un peu vieux, mais cela pourrait vous donner quelques indications supplémentaires. Here est un autre, plus court. Au fait, consultez le WPF toolkit, ils viennent de publier une nouvelle version (version de mars 2009) qui pourrait avoir plus de support pour l'édition/validation que celle utilisée aussi.

Questions connexes