2012-09-19 30 views
6

Estoy aprendiendo Entity Framework (5.0 y VSExpress 2012) y tengo problemas reales para enlazar mi consulta a un dataGridView en WinForms. Tengo el siguiente código y muestra mi consulta bien cuando inicio la aplicación, pero no sé qué hacer para actualizar DataGridView después de cambiar los datos en la base de datos subyacente. ¿Cuál es la mejor manera de hacer esto? ¿Qué estoy haciendo mal aquí?Consulta de vinculación de datos linq a datagridView en 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(); 

     } 
    } 

Respuesta

7

Pho tenga en cuenta que están utilizando Windows Forms no asp.net. De acuerdo con MSDN se puede hacer lo siguiente:

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; 

véase: msdn documentation

+3

Lo hice. La vinculación fue correcta y pude editar los datos de la vista de cuadrícula de datos al usar un botón de guardar con: context.SaveChanges(). El problema es cuando tengo que agregar una nueva fila de datos o eliminarla. Ese tipo de cambios no se reflejan en la base de datos cuando SaveChanges. Tal vez estoy perdiendo un conjunto de propiedades ...? ¿ –

+1

Tengo el mismo problema @ AlejandrodelRío. Ahora voy a spider todas sus preguntas y respuestas para ver si lo resolvió. ¡Deséame suerte! – Robino

+0

@Robino No tengo esta respuesta, pero este enfoque no te ayudará a agregar o eliminar objetos directamente desde la vista de cuadrícula de datos. En su lugar, debe crear una BindingList , donde ObjectToShowInDatagrid es un objeto con los atributos que desea mostrar y tiene una instancia de la entidad de base de datos. También debe agregar el método notifyPropertyCHanged a todo el "conjunto". De esta forma, los cambios se reflejarán en el objeto y la base de datos. Explicaré esto más en una respuesta. –

0

Usted tiene que enlazar los datos con dataGridView1.DataBind();:

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

No veo el método .DataBind() disponible en mi intellisense. Estoy usando Entity Framework 5 y tal vez lo cambiaron a algo más. – Mr1159pm

+0

No estoy muy seguro de por qué no lo ve en su editor, pero sé que tiene que estar vinculado después de asignar un origen de datos :) – pho

+0

El asunto es que esto es más un método .NET en el control GridView en sí, y no tiene nada que ver con Entity Framework. – pho

0

.Net utiliza un modelo desconectado. Cuando obtiene información de la base de datos, es una instantánea en ese momento. Si cambia los datos en el almacén de datos subyacente, esos cambios no se reflejarán a menos que vuelva a consultar explícitamente la base de datos y vuelva a enlazar su UI.

Al guardar los cambios en su UI, EF puede verificar si alguien más cambió la fila que está modificando (por problemas de simultaneidad) y hacerle saber si hay un posible conflicto.

+1

Interesante. ¿Podrías publicar algún ejemplo? Sería útil. –

+0

¿Cómo se alienta a EF a realizar este control? – 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; 
Cuestiones relacionadas