Linq e la XtraGrid di DevExpress

In quest’ultimo periodo ho avuto modo di lavorare con la suite di controlli di DevExpress e in particolare con il controllo XtraGrid che è concettualmente simile alla DataGrid di Visual Studio 2003 nel senso che l’idea che sta alla base è quella di una griglia bound che supporta più layout, ovvero è possibile visualizzare tabelle nello stesso controllo per navigare ad esempio in tabelle padre figlio.

Questa feature è ottenuta tramite il fatto che esiste un GridControl che può contenere più GridView, ma il binding delle varie GridView pare essere fatto sulle relazioni esposte dal BindingSource che a sua volta è connesso alla fonte dati (ad esempio un classe Linq) tramite la proprietà Datasource.

Primo Issue

Si pensi di avere la tabella Autori che puo avere due tabelle figlio Libri e Incassi, se si contruisce una classe Linq to Sql con le due tabelle Autori e Libri e poi si connette a questa una XtraGrid si potrà avere una GridView per gli Autori e unaGridView figlia per i Libri dell’autore.

Se ora si decide di eliminare dalla clase Linq to Sql le due tabelle Autori e Libri (capita a volte quando si modificano le tabelle sul DB per avere aggiornare) e le si riaggiunge, ma nel seguente ordine Autori, Incassi e Libri si ha il problema che la seconda GridView che prima puntava a Libri ora punterebbe a Incassi perchè come ho detto prima sembra che si leghi all’ordine delle relazioni Linq to Sql che ovviamente dipendono dall’ordine con cui sono state trascianate le tabelle.

Secondo Issue

Anche se si usa lo stesso DataContext usato per alimentare il BindingSource connesso alla XtrGrid per inserire, eliminare o modificare i record del DB, l’XtraGrid non viene aggiornata per riflettere questi cambiamenti in quanto le Table Linq non implementano la change notification. A riguardo si veda Question Details: Update Grid after LINQ table was updated.

Terzo Issue

Nella XtraGrid è consentito avere colonne Unbound il cui valore puo essere un’elaborazione del valore di altre colonne o essere impostato nell’evento CustomUnboundColumnData della GridView. Nel caso vengano aggiunte delle righe alla GridView possono però nascere dei problemi in questo caso conviene invocare il metodo BeginDataUpdate delle GridView prima dell’aggiunta e poi il metodo EndDataUpdate terminata l’aggiunta. A riguardo si veda anche Question Details: Can the grid be used completely unbound such that i can just add rows as I wish to it? e il thread working unbound.