A quanto pare LINQ To SQL, almeno nella beta2, non ama molto il databinding.
Prediamo un esempio banale: mostrare il contenuto della tabella Customers di Northwind e aggiungere un nuovo cliente.
Supponendo di avere già creato attraverso il designer di Visual Studio 2008 le varie entities il codice da scrivere è:

   1:  NwDataContext nw = new NwDataContext(@"Data Source=VMXP\SQLEXPRESS;Initial Catalog=Northwind");
   2:   
   3:     public Form1 ()
   4:     {
   5:      InitializeComponent();
   6:      
   7:      dataGridView1.DataSource = nw.Customers; 
   8:     }

Ottenendo come prevedibile l'elenco dei clienti:

image

Ora proviamo ad inserire un nuovo Cliente:

   1:  Customer c = new Customer();
   2:  c.CustomerID = "AAAAA";
   3:  c.ContactName = "Mario Bros";
   4:  c.CompanyName = "Foo Computers";
   5:  nw.Customers.Add(c);
   6:   
   7:  nw.SubmitChanges();  

Risultato: La tabella viene aggiornata ma il contenuto della DatagridView non cambia, volendola aggiornare bisognerebbe, dopo l'aggiornamento, scrivere qualcosa tipo:

   1:  nw.SubmitChanges();
   2:  dataGridView1.DataSource = nw.Customers.GetNewBindingList();

In realtà è possibile evitare l'uso di GetNewBindingList() e il relativo scorrimento del contenuto in memoria della tabella usando questo approccio tutt'altro che intuitivo.

   1:     NwDataContext nw = new NwDataContext(@"Data Source=VMXP\SQLEXPRESS;Initial Catalog=Northwind");
   2:     BindingList<Customer> cbl;
   3:   
   4:     public Form1 ()
   5:     {
   6:      InitializeComponent();
   7:   
   8:      IListSource ls = nw.Customers as IListSource;
   9:      cbl = ls.GetList() as BindingList<Customer>;
  10:      dataGridView1.DataSource = cbl; 
  11:     }  
  12:   
  13:     private void button2_Click (object sender, EventArgs e)
  14:     {
  15:      Customer c = cbl.AddNew();
  16:      c.CustomerID = "AAAAA";
  17:      c.ContactName = "Mario Bros";
  18:      c.CompanyName = "Foo Computers";
  19:      cbl.EndNew(cbl.IndexOf(c));
  20:      nw.SubmitChanges();  
  21:     }

Il tutto funziona grazie al fatto che Table<T> espone IListSource il cui metodo GetList() e castabile verso BindingList.

Technorati Tags: ,