2012-09-19 20 views
6

Uczę się Entity Framework (5.0 i VSExpress 2012) i mam prawdziwy problem wiążący moje zapytanie z danymi GridView w WinForm. Mam poniższy kod i wyświetla moje zapytanie w porządku po uruchomieniu aplikacji, ale nie wiem, co muszę zrobić, aby zaktualizować daneGridView po zmianie danych w podstawowej bazie danych. Jaki jest najlepszy sposób na zrobienie tego? Co ja tu robię źle?Dane wiążące zapytanie linq do datagridView w 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(); 

     } 
    } 

Odpowiedz

7

Pho należy pamiętać, że są one za pomocą WinForm nie ASP.NET. Zgodnie z MSDN można wykonać następujące czynności:

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; 

patrz: msdn documentation

+3

Zrobiłem to. Wiązanie było poprawne i mogłem edytować dane z datagridview, gdy użyłem przycisku zapisu z: context.SaveChanges(). Problem polega na tym, że muszę dodać nowy wiersz danych lub go usunąć. Tego rodzaju zmiany nie są odzwierciedlane w bazie danych podczas SaveChanges. Może zapomnę o pewnych ustawieniach ...? –

+1

Mam ten sam problem @ AlejandrodelRío. Teraz mam zamiar spider wszystkie pytania i odpowiedzi, aby sprawdzić, czy to rozwiązałeś. Życz mi szczęścia! – Robino

+0

@Robino Nie mam odpowiedzi na to pytanie, ale to podejście nie pomoże ci dodawać ani usuwać obiektów bezpośrednio z datagridview. Zamiast tego musisz utworzyć BindingList , gdzie ObjectToShowInDatagrid jest obiektem z atrybutami, które chcesz wyświetlić, i ma instancję jednostki bazy danych. Trzeba również dodać metodę notifyPropertyCHanged do wszystkich "zestawów". W ten sposób zmiany zostaną odzwierciedlone w obiekcie i bazie danych. Wyjaśnię to dalej w odpowiedzi. –

0

Trzeba powiązać dane z dataGridView1.DataBind();:

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

Nie widzę metody .DataBind() dostępnej w mojej intellisense. Używam Entity Framework 5 i może zmienili to na coś innego. – Mr1159pm

+0

Nie jestem zbyt pewien, dlaczego nie widzisz go w edytorze, ale wiem, że musi być związany po przypisaniu źródła danych :) – pho

+0

Chodzi o to, że jest to bardziej metoda .NET na formancie GridView sam w sobie, a nie ma nic wspólnego z Entity Framework. – pho

0

Net wykorzystuje odłączonego model. Podczas pobierania informacji z bazy danych jest to migawka w tym momencie. W przypadku zmiany danych w podstawowej składnicy danych zmiany te nie zostaną odzwierciedlone, dopóki nie zostanie jawnie ponownie wysłane zapytanie do bazy danych i ponowne powiązanie interfejsu użytkownika.

Po zapisaniu zmian w interfejsie użytkownika EF może sprawdzić, czy ktoś inny zmienił wiersz, który modyfikujesz (w przypadku problemów dotyczących współbieżności) i poinformować Cię, czy istnieje potencjalny konflikt.

+1

Interesujące. Czy możesz podać przykład? Byłoby użyteczne. –

+0

Jak zachęcić EF do przeprowadzenia tej kontroli? – 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; 
Powiązane problemy