2013-05-23 15 views
6

Ho un DevExpress GridControl per il quale io pongo è origine dati in questo modo:associazione dei dati direttamente a una query negozio (DbSet, DBQuery, DbSqlQuery) non è supportato Entity Framework 5

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

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

Ma quando uso il la griglia, le righe che aggiungo o elimini non vengono salvate, vengono salvate solo le modifiche alle righe iniziali.

Se faccio questo:

gridControl1.DataSource = context.chaps.Local; 

non ho ricevuto alcuna riga, e AddNewRow neppure non aggiungere una nuova riga visivamente.

Se faccio questo:

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

ricevo le righe e possono salvare le modifiche ad essi; le righe vengono rilevate visivamente ma non nel db e non possono essere AddNewRow.

Se faccio questo:

gridControl1.DataSource = context.chaps; 

ottengo questa eccezione:

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(). 

ma context.chaps.Local non ha un metodo ToBindingList sia.

Non penso che questo sia un problema di devexpress, ma piuttosto non riesco a capire come impostare correttamente un'origine dati. C'è un modo per ottenere un equivalente context.chaps.Local.ToBindingList()?

risposta

7

context.chaps.Local è un ObservableCollection<T>. Ma ToBindingList non è un metodo di ObservableCollection<T> ma un metodo di estensione in DbExtensions:

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

Per poter utilizzare questo metodo e vederlo con Intellisense è necessario includere il namespace corrispondente nel file di codice in cui si tenta di chiamare ToBindingList() :

using System.Data.Entity; 
+0

Così ho fatto gridControl1.DataSource = DbExtensions.ToBindingList (context.capitulo.Local); che funziona totalmente! Posso aggiungere, modificare ed eliminare. Tranne che non carica tutte le righe che ho inizialmente (il mio datagrid è vuoto). Qualche idea di come farlo? O avevo frainteso la risposta? – user2414791

+1

@ user2414791: la sintassi standard quando si utilizzano i metodi di estensione è simile ai normali metodi di istanza: 'gridControl1.DataSource = context.capitulo.Local.ToBindingList();'. Ma non penso che risolverà il problema. Ovviamente devi comunque usare 'regs.ToList()' o 'regs.Load()' o 'context.chaps.Load()' per caricare qualcosa dal DB. 'Local' non esegue una query, fornisce solo le entità che sono già state caricate come' ObservableCollection'. – Slauma

+0

Perfetto! Grazie!!!! – user2414791

1

Assicurarsi di aver caricato tutte le righe prima di collegare l'origine dati alla lista di rilegature.

context.chaps.load 'carica i dati gridcontrol1.datasource = context.chaps.Local.ToBindingList()' questo caricherà i record sulla griglia. darti anche una nuova riga da aggiungere o puoi anche aggiornare la griglia.