2012-09-19 1 views
6

Sto imparando Entity Framework (5.0 e VSExpress 2012) e sto riscontrando problemi nel collegare la mia query a un oggetto DataGridView in WinForms. Ho il codice seguente e visualizza la mia richiesta ok quando avvio l'applicazione ma non so cosa devo fare per aggiornare il DataGridView dopo aver cambiato i dati nel database sottostante. Qual è il modo migliore per farlo? Cosa sto facendo di sbagliato qui?Data binding query linq a datagridView in Entity Framework 5.0

private void Form1_Load(object sender, EventArgs e) 
    { 
     using(var ctx = new TimeKeepEntities()) 
     { 

      var qLoggedIn = from r in ctx.tblTimeRecords 
         where (r.tblEmployee.Active && !r.ClockOut.HasValue) || System.Data.Objects.EntityFunctions.DiffDays(r.ClockOut, DateTime.Now)<30 
         select new { Name = r.tblEmployee.Last + ", " + r.tblEmployee.First, r.tblProject.ProjName, r.ClockIn, r.ClockOut }; 

      dataGridView1.DataSource = qLoggedIn.ToList(); 

     } 
    } 

risposta

7

Pho si prega di notare che non sono utilizzando WinForms asp.net. Secondo MSDN è possibile effettuare le seguenti operazioni:

BindingSource bindingSource1 = new BindingSource(); 
bindingSource1.DataSource = (from r in ctx.tblTimeRecords 
         where (r.tblEmployee.Active && !r.ClockOut.HasValue) || System.Data.Objects.EntityFunctions.DiffDays(r.ClockOut, DateTime.Now)<30 
         select new { Name = r.tblEmployee.Last + ", " + r.tblEmployee.First, r.tblProject.ProjName, r.ClockIn, r.ClockOut }).ToList(); 

dataGridView1.DataSource = bindingSource1; 

vedi: msdn documentation

+3

Ho fatto questo. L'associazione era corretta e sono stato in grado di modificare i dati dal datagridview quando si utilizza un pulsante di salvataggio con: context.SaveChanges(). Il problema è quando devo aggiungere una nuova riga di dati o eliminarla. Questo tipo di modifiche non si riflettono nel database quando SaveChanges. Forse sto dimenticando alcuni set di proprietà ...? ¿ –

+1

Sto avendo lo stesso problema @ AlejandrodelRío. Ora vado a spider tutte le tue domande e risposte per vedere se l'hai risolto. Augurami buona fortuna! – Robino

+0

@Robino Non ho questa risposta, ma questo approccio non ti aiuterà ad aggiungere o eliminare oggetti direttamente dal datagridview. Invece devi creare un BindingList , dove ObjectToShowInDatagrid è un oggetto con gli attributi che vuoi mostrare e ha un'istanza dell'entità del database. Devi anche aggiungere il metodo notifyPropertyCHanged a tutto il "set". In questo modo le modifiche si rifletteranno sull'oggetto e sul database. Lo spiegherò ulteriormente in una risposta. –

0

si deve associare i dati con dataGridView1.DataBind();:

... 
dataGridView1.DataSource = qLoggedIn.ToList(); 
dataGridView1.DataBind(); 
... 
+0

Non vedo il metodo .DataBind() disponibile nel mio intellisense. Sto usando Entity Framework 5 e forse lo hanno cambiato in qualcos'altro. – Mr1159pm

+0

Non sono sicuro del motivo per cui non lo vedi nel tuo editor, ma so che deve essere associato dopo aver assegnato un'origine dati :) – pho

+0

Il fatto è che si tratta più di un metodo .NET sul controllo GridView stesso, e non ha nulla a che fare con Entity Framework. – pho

0

.NET utilizza un modello disconnesso. Quando recuperi le informazioni dal database, è un'istantanea in quel momento. Se si modificano i dati nell'archivio dati sottostante, tali modifiche non verranno applicate a meno che non si riesca a interrogare esplicitamente il database e a rebindare l'interfaccia utente.

Quando si salvano le modifiche nell'interfaccia utente, EF può verificare se qualcun altro ha modificato la riga che si sta modificando (per problemi di concorrenza) e segnalare se esiste un potenziale conflitto.

+1

Interessante. Potresti postare qualche esempio? Sarebbe utile. –

+0

Come si incoraggia EF a eseguire questo controllo? – Robino

0
IEnumerable<DataRow> query =(from p in orginalList.AsEnumerable() 
            where p.Field<long>("Category") == 2 
            select p).ToList(); 
         DataTable boundTable = query.CopyToDataTable<DataRow>(); 

         dataGridView1.AutoGenerateColumns = false; 

         dataGridView1.DataSource = boundTable;