2013-05-23 13 views
6

Mam DevExpress GridControl dla których jestem ustawienie to źródło danych tak:Powiązanie danych bezpośrednio do zapytania możliwy (DbSet, DbQuery, DbSqlQuery) nie jest obsługiwany Entity Framework 5

var regs = (from vcap in context.chaps 
          select vcap); 

gridControl1.DataSource = new BindingList<chaps>(regs.ToList()); 

Ale kiedy używać siatki, wiersze, które dodaję lub usuwam, nie zostają zapisane, zapisywane są tylko zmiany w początkowych wierszach.

Gdybym to zrobić:

gridControl1.DataSource = context.chaps.Local; 

nie dostanę żadnych wierszy i AddNewRow nawet nie dodać nowy wiersz wizualnie.

Gdybym to zrobić:

gridControl1.DataSource = context.chaps.ToList(); 

uzyskać wiersze i może zapisać zmiany do nich; wiersze zostaną usunięte wizualnie, ale nie w db, i nie można AddNewRow.

Gdybym to zrobić:

gridControl1.DataSource = context.chaps; 

otrzymuję ten wyjątek:

Data binding directly to a store query (DbSet, DbQuery, DbSqlQuery) is not supported. Instead populate a DbSet with data, for example by calling Load on the DbSet, and then bind to local data. For WPF bind to DbSet.Local. For WinForms bind to DbSet.Local.ToBindingList(). 

ale context.chaps.Local nie ma metody ToBindingList albo.

Nie sądzę, że jest to problem devexpress, ale raczej nie mam pojęcia, jak poprawnie ustawić źródło danych. Czy istnieje sposób, aby uzyskać odpowiednik context.chaps.Local.ToBindingList()?

Odpowiedz

7

context.chaps.Local to ObservableCollection<T>. Ale ToBindingList nie jest metodą ObservableCollection<T> ale metoda rozszerzenie DbExtensions:

public static BindingList<T> ToBindingList<T>(
    this ObservableCollection<T> source) where T : class; 

W celu wykorzystania tej metody i zobaczyć go z IntelliSense trzeba podać odpowiednią przestrzeń nazw w pliku z kodem gdzie spróbować zadzwonić ToBindingList() :

using System.Data.Entity; 
+0

Zrobiłem więc gridControl1.DataSource = DbExtensions.ToBindingList (context.capitulo.Local); co całkowicie działa! Mogę dodawać, modyfikować i usuwać. Poza tym, że nie ładuje wszystkich wierszy, które mam na początku (mój datagrid jest pusty). Masz pomysł, jak to zrobić? A może źle zrozumiałem odpowiedź? – user2414791

+1

@ user2414791: Standardowa składnia podczas używania metod rozszerzeń jest podobna do zwykłych metod instancji: 'gridControl1.DataSource = context.capitulo.Local.ToBindingList();'. Ale nie sądzę, że rozwiąże to problem. Oczywiście nadal musisz używać 'regs.ToList()' lub 'regs.Load()' lub 'context.chaps.Load()', aby załadować wszystko z DB. 'Local' nie uruchamia kwerendy, po prostu dostarcza encji, które zostały wcześniej załadowane jako' ObservableCollection'. – Slauma

+0

Idealny! Dzięki!!!! – user2414791

1

Upewnij się, że wczytałeś wszystkie wiersze przed powiązaniem źródła danych z listą powiązań.

context.chaps.load "załaduj swoje dane gridcontrol1.datasource = context.chaps.Local.ToBindingList()" spowoduje to załadowanie rekordów na siatkę. daje ci także nowy wiersz do dodania nowych lub możesz również zaktualizować tabelę.

Powiązane problemy