web-dev-qa-db-fra.com

Comment actualiser un WPF DataGrid?

J'ai un WPF DataGrid avec quelques données. Vous pouvez ajouter des lignes via une fenêtre séparée. Le DataContext est le même, un objet LINQ-to-SQL. La liaison est également identique, je lie la propriété "ItemsSource" à une table.

Dans l'autre fenêtre, lorsque l'utilisateur clique sur "Enregistrer", je crée une ligne par programme et l'ajoute à l'aide de "InsertOnSubmit". Après cela, j'utilise la méthode "SubmitChanges" de DataContext.

Mon problème est que le DataGrid n'est pas mis à jour. Si je redémarre l'application, je peux voir la nouvelle ligne, donc c'est dans la base de données, mais je ne pouvais pas trouver un moyen d'actualiser le DataGrid.

Jusqu'à présent, j'ai essayé d'utiliser "UpdateTarget" sur l'expressionBindingExpression du DataGrid, mais cela n'a pas aidé. J'ai aussi essayé "dataGrid.Items.Refresh ()" - même résultat. Comment puis-je réparer cela?

24
KovBal

La raison pour laquelle il ne met pas à jour est que LINQ-to-SQL n'implémente pas INotifyCollectionChanged, donc WPF n'a aucun moyen de savoir que l'élément Source a été mis à jour. La façon la moins terrifiante de résoudre ce problème consiste à copier vos résultats LINQ-to-SQL dans un ObservableCollection - lorsque vous effectuez l'insertion, ajoutez-le également à la collection observable. Ensuite, vous verrez la mise à jour.

20
Paul Betts

essayez datagrid.Items.Refresh () à partir d'ici http://programmer.wrighton.org/2009/01/wpf-datagrid-items-refresh.html

63
nullpointer

J'ai rencontré le même problème et trouvé que DataContext est le meilleur endroit pour ObservableCollection. Certaines méthodes partielles générées par le concepteur peuvent être utilisées pour mettre à jour la collection. Ce code fonctionne plutôt bien:

partial class DataClassesDataContext
{
    private ObservableCollection<Task> taskCollection;
    public ReadOnlyObservableCollection<Task> TaskView { get; private set; }

    partial void OnCreated()
    {
        taskCollection = new ObservableCollection<Task>(Tasks);
        TaskView = new ReadOnlyObservableCollection<Task>(taskCollection);
    }

    partial void InsertTask(Task instance)
    {
        taskCollection.Add(instance);
        this.ExecuteDynamicInsert(instance);
    }

    partial void DeleteTask(Task instance)
    {
        taskCollection.Remove(instance);
        this.ExecuteDynamicDelete(instance);
    }
}
4
Dark Daskin

Le problème est que vous devez actualiser votre DataContext LINQ-to-SQL. Le DataContext ne reconnaîtra pas correctement la nouvelle ligne, même après une modification de soumission. Vous devez disposer du DataContext que vous avez et en créer un nouveau. Dans la plupart des cas, DataContext doit être utilisé pour une opération courte et non comme un objet ancien.

2
Stephan

Si vous avez un cas où vous devez recharger une grille dans une autre fenêtre, vous pouvez simplement fermer cette fenêtre et l'invoquer à nouveau.

1
user504737

Ou simplement invoquer à nouveau le code de recherche (généralement le bouton de recherche)> Je l'ai résolu dans mon cas comme ceci.

0
Branimir

Pour une raison quelconque, Items.Refresh() ne fonctionne pas pour moi . Ce qui a fonctionné a été de faire hériter ma collection sous-jacente ObservableCollection et d'appeler sa méthode Add.

((ContactUIObjects)dgrdContacts.ItemsSource).Add(new ContactUIObject(o));

ContactUIObjects n'est que la grille sous-jacente à la collection.

0
Orson