2011-01-23 5 views
5

Tentativo di aggiungere nuovi record a EntityCollection in fase di esecuzione e di avere l'aggiornamento DataGridView con le nuove informazioni.Come ottenere un DataGridView di Windows Form per mostrare nuovi record quando associato a EntityCollection

Ho provato a collegare il datagridview direttamente alla raccolta di entità (ad esempio ObjectSet) e tramite una BindingSource associata alla stessa raccolta.

Ho provato DataGridView.Refresh(), DataGridView.EndEdit() e BindSource.ResetBindings() tra le altre cose, ma nulla sembra funzionare.

risposta

0

Prova che:

bindingSource.DataSource = null; 
bindingSource.DataSource = theCollection; 

In alternativa, è possibile mantenere una copia in memoria dei dati in un BindingList<T>. Associare DataGridView a BindingList e quando si aggiunge un'entità allo ObjectSet, aggiungerlo anche allo BindingList.

+0

alias modo ghetto, :). Speravo in un metodo di forza meno bruta. Questo non funziona sebbene causa che sono attualmente associato a BindingSource. Quale risulta nella cancellazione della griglia. – Jaime

+0

Le entità non funzionano bene con DataGridView? Quindi ho bisogno di tenere 2 collezioni degli stessi dati per farlo funzionare? – Jaime

+0

@Jaime, è necessario rendersi conto che un ObjectSet non è realmente una collezione, in realtà è una * query *. Non mantiene le entità in memoria (anche se ObjectContext mantiene una cache di entità già caricate) –

0

Sono bloccato con lo stesso problema. Microsoft dovrebbe preoccuparsi delle persone che usano la loro tecnologia e EF dovrebbe occuparsi dell'associazione dei dati. Jaime, se trovi un modo migliore, aggiorna questo elenco. Per me, ricreare l'istanza di contesto funziona bene per me. La cosa divertente è che il debugger mostra che la fonte di binding del contesto dell'entità & ha gli ultimi aggiornamenti, ma datagridview non si aggiorna ancora. Grazie

Here è la soluzione migliore che ho trovato finora -

Fondamentalmente è necessario fare

bindingSource.DataSource = EntityContext.Collection 
           .Execute(MergeOption.AppendOnly); 
0

Spero che non sia troppo tardi =) ho qualcosa che funziona qui ...

// Entity Data Model 
private ManagerEntities context = new ManagerEntities(); 

// declare private member  
private BindingList<Currency> lstCurrencies = null; 

// on form load, load data and bind to DataGridView's DataSource 

private void Form1_Load(object sender, EventArgs e) { 

    lstCurrencies = new BindingList<Currency>(); 

    ObjectResult or = ((ObjectQuery)currencies).Execute(MergeOption.AppendOnly); 
    foreach (Currency c in or) 
     lstCurrencies.Add(c); 

    // dgMain is my DataGridView 
    dgMain.DataSource = lstCurrencies; 
} 

// this will save objects that have changed. You might want to add logic for newly created and deleted objects. 
private void btnSave_Click(object sender, EventArgs e) { 
    context.SaveChanges(); 
}