Kategorie szkoleń | Egzaminy | Kontakt
  • 1
  • 1
  • 182

Witam.

Zastanawiam się nad najlepszym rozwiązaniem problemu. Na podstawie klasy encji tworzę ObservableCollection i zawartość wyświetlam w DataGrid. Jeśli zmodyfikuje dane w kolekcji to zmiany nie zostaną zmodyfikowane w bazie. Jeśli dokonam modyfikacji, modyfikując klasę encji to zmiany w bazie są uwzględnione, ale nie widzę zmian w kolekcji i tym samym zmiany nie są uwzględnione w DataGrid.
Obecnie po każdej zmianie danych w bazie równolegle dokonuje zmian w kolekcji. Czy jest na to inny sposób?

Oczywiście nie wchodzi w grę zamykanie i otwieranie programu :-).

Będę wdzięczny za wskazówki.

Pozdrawiam

Bogdan

Bogdan_Chlebowski_DCHK
  • Zapytał
  • @ Bogdan_Chlebowski_DCHK | 06.07.2015
    • 3
    • 4
    • 12
Zaloguj się aby zadać pytanie
Pokrewne

Odpowiedź (1)

  • 2

Jeśli chodzi o interfejs użytkownika to klasa ObservableCollection implementuje interfejs INotifyCollectionChanged, który odświeża kontrolkę DataGrid tylko w przypadku, gdy zostanie dodany lub usunięty element. Niestety nie obsługuje przypadku, gdy zmieni się wartość pojedynczego obiektu w kolekcji.

Aby to osiągnąć encja musi dodatkowo implementować interfejs INotifyPropertyChanged. Przykładów implementacji tego interfejsu jest wiele - pisałem o tym tutaj https://goo.gl/JByxUG.

Jeśli zaś chodzi o zapis do bazy danych to Entity Framework potrafi na bieżąco śledzić zmiany na twoich obiektów i utrwalać je w bazie danych. Wystarczy wywołać metodę context.SaveChanges();

Ale rozumiem, że chciałbyś wyświetlać również zmiany dokonywane przez innego użytkownika? Odsyłam do opisu https://goo.gl/g9AHCx oraz przykładu implementacji: https://code.msdn.microsoft.com/How-to-use-SqlDependency-5c0da0b3.

Napisz czy to rozwiązuje twój problem. 

 

  • Odpowiedział
  • @ | 06.07.2015
  • TRENER ALTKOM AKADEMII
Komentarze
witam
Bardzo dziękuję za podpowiedzi. Właściwie to brakowało mi jednego elementu. Rozwiązanie znalazłem tutaj http://www.codeproject.com/Tips/853383/Adding-INotifyPropertyChanged-to-Entity-Framework.
Nie jestem w stanie wprost zaimplementować INotifyPropertyChanged, ponieważ model jest tworzony automatycznie.
Innym sposobem jest:
Edycja modelu i zmiana property na private
public partial class Customer
{
private int _nazwa { get; set; }
}
Następnie utworzenie klasy partial i dodanie property public i zaimplementowanie INotifyPropertyChanged. Niestety jeśli zmieni się model to trzeba krok powtórzyć
public partial class Customer : INotifyPropertyChanged
{
public Int Nazwa
{
get
{
return this._nazwa;
}
set
{
this._nazwa = value;

Skomentował : @ Bogdan_Chlebowski_DCHK ,03.09.2015
  • 3
  • 4
  • 12
W jaki sposób generowany jest twój kod? Może poprawić szablon na podstawie, które jest generowany kod.

Możesz spróbować całkowicie inaczej podejść do tematu notyfikacji - użyć atrybutów, na podstawie których jest automatycznie generowany kod notyfikacji.

Zerknij na przykład na bibliotekę Fody, której wystarcza dodanie atrybutu do klasy [ImplementPropertyChanged].

Więcej na ten temat:
http://www.altcontroldelete.pl/artykuly/biblioteki-warte-poznania-w-c-fody/

Skomentował : @ TRENER ALTKOM AKADEMII ,01.12.2015