giovedì 21 giugno 2007

DataBinding con Access e Visual Studio 2005

Ho ricevuto alcuni messaggi che mi chiedono delucidazioni sul binding di Access, con questo mio post li voglio accontentare anche se forse avrei fatto meglio a non farlo, sono del parere che certe esperienze "perverse" con Access vanno fatte di nascosto e da soli :)).

Con Visual Studio è possibile generare dei programmi che si interfacciano con access quasi senza scrivere una riga di codice.

Ovviamente questa grande facilità non ci deve portare a non curarsi di manuali ed help in linea, soprattutto non ci deve portare a pensare di poter mettersi al computer e scrivere un programma solo posizionando qualche controllo con l'ide.

Generare un progetto simile a questo è molto facile, addirittura banale se si conosce come si comporta il wizard e si riesce a scrivere poche righe di codice nel punto "giusto".

Ovviamente si tratta di un progetto che può servire solo come base di studio e approfondimento.

Veniamo al progetto e alla sua costruzione:

Si parte con il creare un nuovo progetto windows forms, a progetto aperto si aggiunge un database di Access (si può anche fare copia-incolla di access nel progetto).

Si apre il wizard con la scelta delle tabelle, io ho selezionato tutte le tabelle del database anche se poi ne ho utilizzato solo 3.

Si compila il progetto in modo tale da dare la possibilità a Visual Studio di attaccare alla toolbar i nuovi oggetti prodotti (DataSet e TableAdapter, un TableAdapter per tabella).

Si prendono dalla ToolBar gli oggetti necessari

Si impostano le proprietà appropriate, impossibile sbagliare con dei nomi così espliciti :)

Ora inizia la parte del codice da inserire, parte che notoriamente divide il grano dall'oglio.

Si inserisce il codice sull'evento Load della form (o in un altro punto comunque precedente alla visualizzazione del form che apparirebbe vuota), ciascun tableadapter comincia a svolgere la propria funzione:

Nota: Per praticità inserisco solo il codice C#, il corrispondente codice VB.NET è recuperabile dal progetto.

customersTableAdapter1.Fill(this.nwindDataSet1.Customers);
ordersTableAdapter1.Fill(
this.nwindDataSet1.Orders);
order_DetailsTableAdapter1.Fill(nwindDataSet1.Order_Details);


Si aggiungono gli eventi necessari ad intercettare lo spostamento del BindingSource collegato alle tabelle Customer e Orders



bindingCustomers.PositionChanged += new EventHandler(bindingCustomers_PositionChanged);
bindingOrders.PositionChanged
+= new EventHandler(bindingOrders_PositionChanged);

Intercettare gli eventi ha lo scopo di impostare dei filtri sui dati in modo tale da far apparire sempre solo gli ordini del cliente visualizzato e solo i dettagli degli ordini dell'ordine selezionato.


void bindingCustomers_PositionChanged(object sender, EventArgs e)
{
string customerID = string.Empty;
if (bindingCustomers.Current != null)
{
DataRowView dv
= (DataRowView) bindingCustomers.Current;
customerID
= (string)dv["CustomerID"];
}
bindingOrders.Filter
= string.Format("CustomerID = '{0}'", customerID);
bindingOrders_PositionChanged(
null, null);
}

Il codice inserito serve a recuperare il customerID dall'oggetto DataRowView indicato dalla proprietà "Current" di bindingCustomers, per forza di cose è necessario sincerarsi che tale oggetto non sia nullo.
Successivamente è possibile impostare un filtro sugli ordini.
bindingOrders_PositionChanged(null, null); invece serve per "svegliare" bindingOrders in modo tale da causare una successiva reposition con emissione dell'evento.


L'altro evento


void bindingOrders_PositionChanged(object sender, EventArgs e)
{
int orderID = 0;
if (bindingOrders.Current != null)
{
DataRowView dv
= (DataRowView)bindingOrders.Current;
orderID
= (int)dv["orderID"];
}
bindingDetail.Filter
= string.Format("OrderID = {0}", orderID);
}

E' utilizzato per impostare il filtro sul dettaglio degli ordini, sono visualizzati pertanto solo i dettagli che appartengono all'ordine.

Questo è quanto! :)

Riferimenti:

Esempio VB.NET
Esempio C#

Nessun commento: