Nella scorsa puntata della nostra guida “passo-passo” dedicata a Visual Basic 2005 (ved. questa pagina) abbiamo iniziato a mostrare come sia possibile sviluppare un’applicazione collegata ad una base dati con la versione “Express”, completamente gratuita.
Proseguiamo nello sviluppo della nostra prima applicazione esemplificativa. Per qualsiasi dubbio, vi invitiamo a far riferimento alla precedente puntata.
Coloro che non avessero ancora prelevato Visual Basic 2005 Express in italiano possono far riferimento al link per il download ed alle istruzioni per l’installazione riportati nello stesso articolo.
Aggiungiamo un nuovo form che ospiterà le informazioni dettagliate sulla fattura selezionata dall’utente. Clicchiamo sul menù Progetto, Aggiungi Windows Form di Visual Basic 2005, selezioniamo Windows Form quindi digitiamo, nel campo “Nome”, quanto segue: frmDettaglio.vb
.
Dopo aver fatto doppio clic su frmDettaglio.vb
dalla finestra Esplora soluzioni, portiamoci in Origini dati, clicchiamo sulla tabella Prestazioni quindi, dal suo menù a tendina, selezioniamo la voce DataGridView; trasciniamo – tenendo premuto il tasto sinistro del mouse – la voce “Prestazioni” sul form “frmDettaglio”.
Nella griglia dati appena inserita, ci proponiamo di visualizzare il dettaglio relativo ad ogni singola fattura presente in archivio.
Facciamo clic sul pulsante a forma di freccia collocato in alto a destra nel “DataGridView” che elenca le fatture e che abbiamo inserito nel form frmFatture nel corso della precedente puntata. Scegliamo quindi la voce Modifica colonne. Accertiamoci di aver selezionato il campo denominato “ID” (l’identificativo numerico assegnato automaticamente a ciascuna fattura e memorizzato nel database) quindi variamone la proprietà “(Name)” in IDFattura
.
Nascondiamo ed impostiamo a sola lettura i campi ID ed ID_Cliente: per far ciò, è sufficiente selezionare, uno per uno, i due campi quindi impostare a False la proprietà “Visible” mentre a True la proprietà “ReadOnly”.
Sempre ricorrendo al pulsante a forma di freccia, disattiviamo la casella Attiva aggiunta: tratteremo in modo specifico l’evento relativo all’inserimento di una nuova fattura.
Facciamo doppio clic con il mouse in un’area libera del form frmDettaglio: ci verrà immediatamente proposto il codice dell’evento frmDettaglio_Load
.
Qui è possibile notare come Visual Basic 2005 abbia provveduto ad aggiungere le istruzioni che seguono:
'TODO: questa riga di codice carica i dati nella tabella 'FattureDataSet.Prestazionì. È possibile spostarla o rimuoverla se necessario.
Me.PrestazioniTableAdapter.Fill(Me.FattureDataSet.Prestazioni)
In questo modo il programma visualizzerebbe, all’interno della griglia appena aggiunta sul form frmDettaglio (PrestazioniDataGridView
), i “dettagli fattura” relativi a tutte le fatture in archivio.
In realtà, ciò che vogliamo ottenere nel nostro esempio, è la visualizzazione delle prestazioni relative alla fattura di volta in volta selezionata dall’utente mediante la griglia FattureDataGridView contenuta nel forum frmFatture.
Iniziamo quindi con l’eliminare le istruzioni automaticamente aggiunte da Visual Basic 2005 nell’evento frmDettaglio_Load
ossia:
'TODO: questa riga di codice carica i dati nella tabella 'FattureDataSet.Prestazionì. È possibile spostarla o rimuoverla se necessario.
Me.PrestazioniTableAdapter.Fill(Me.FattureDataSet.Prestazioni)
Interveniamo sulla struttura del Dataset
Facciamo, poi, doppio clic su FattureDataSet.xsd: la finestra che comparirà a video riassume graficamente la struttura del database e restituisce tutte le informazioni sulle relazioni tra le varie tabelle, sugli indici, sui valori predefiniti per i vari campi e così via.
Clicchiamo con il tasto destro del mouse su PrestazioniTableAdapter quindi sulla voce Aggiungi query.
Dalle finestre seguenti optiamo, in sequenza, per Usa istruzioni SQL, SELECT che restituisce righe quindi introduciamo la query SQL che ci servirà successivamente per inserire, nel DataGridView FattureDataGridView solo le prestazioni afferenti alla fattura selezionata.
Digitiamo nella finestra Specifica un’istruzione SQL SELECT quanto segue:
Al solito, il simbolo ?
(punto interrogativo) funge da “segnaposto” per il valore del parametro. La query che abbiamo introdotto, in sostanza, consente di selezionare solo i record della tabella “Prestazioni” (dettagli fattura) del database che nel campo ID_fattura
abbiano l’identificativo della fattura al momento selezionata da parte dell’utente.
Come già evidenziato nella scorsa puntata, la sintassi per l’impostazione del parametro può variare a seconda del DBMS utilizzato. Nel caso di Access, ad esempio, si utilizza il punto interrogativo (?
) ma nel caso di SQL Server bisogna utilizzare il simbolo @
(ad esempio: @ID_fattura
).
Come nomi dei metodi (Riempi database e Restituisci un DataTable) scriviamo, rispettivamente, FillByIDFattura
e GetDataByIDFattura
. Clicchiamo ancora su Avanti quindi sul pulsante Fine.
Il “table adapter” della tabella “Prestazioni” annovererà adesso la nuova query appena aggiunta:
Portiamoci adesso nel codice del form frmDettaglio e, nell’evento frmDettaglio_Load
, al posto delle istruzioni precedentemente eliminate, digitiamo quanto segue:
In questo modo, all’atto del caricamento del form frmDettaglio, la griglia dati PrestazioniDataGridView verrà popolata soltanto con i record aventi come campo “ID_Fattura” quello indicato nel DataGridView che elenca le fatture del cliente al momento scelto.
L’istruzione che abbiamo provveduto ad aggiungere, trasmette al metodo FillByIDFattura
, e quindi alla relativa query SQL SELECT, il parametro corrispondente all’ID della fattura correntemente selezionata.
L’ID della fattura al momento selezionata da parte dell’utente viene recuperato mediante l’istruzione frmFatture.FattureDataGridView.CurrentRow.Cells("IDFattura").Value
.
Metodi, parametri e proprietà del DataGridView
Torniamo ora al form frmFatture, portiamoci all’interno dell’evento frmFatture_Load
ed aggiungiamo l’istruzione seguente:
Nel momento in cui viene inserito un nuovo record (“row”) nel dataset e, precisamente, nella tabella “Fatture”, viene lanciato l’evento onTableNewRow
.
Prima dell’istruzione finale End Class
, inseriamo allora quanto segue:
Private Sub onTableNewRow(ByVal sender As Object, ByVal e As DataTableNewRowEventArgs)
e.Row("ID_cliente") = Me.m_ParametroIDCliente
End Sub
Così facendo, nel momento in cui l’utente richiederà l’inserimento di un nuovo record nella griglia dati FattureDataGridView ovvero l’aggiunta di una nuova fattura, il programma intercetterà l’evento e provvederà ad impostare il valore del campo ID_cliente con l’identificativo del cliente correntemente selezionato (e.Row("ID_cliente") = Me.m_ParametroIDCliente
).
Portiamoci adesso nella finestra di progettazione (“design”) del form frmFatture e posizioniamo un pulsante sotto la griglia dati FattureDataGridView selezionandolo dalla “casella degli strumenti” di Visual Basic.
Impostiamo la proprietà “(Name)” del pulsante a btnDettaglio
mentre la proprietà Text a Dettaglio fattura
.
Un doppio clic sul pulsante appena aggiunto permette di accedere alla finestra del codice ed, in particolare, all’evento btnDettaglio_Click
.
Digitiamo, al suo interno, quanto segue:
Dim posizione
FattureBindingNavigatorSaveItem_Click(sender, e)
posizione = Me.FattureBindingSource.Position
Me.FattureTableAdapter.FillByIDCliente(Me.FattureDataSet.Fatture, Me.m_ParametroIDCliente)
Me.FattureBindingSource.Position = posizione
frmDettaglio.ShowDialog()
La seconda istruzione invoca la memorizzazione, all’interno del database, delle modifiche apportate alla griglia dati FattureDataGridView quindi effettua una sorta di “refresh” del contenuto della stessa in modo da adeguare gli identificativi automaticamente assegnati, ad esempio, ai nuovi record.
Viene infine richiesto il caricamento del form frmDettaglio.
Avviando la nostra applicazione, mediante la pressione del tasto F5, se ne potrà verificare il corretto funzionamento. Dopo aver selezionato un cliente, cliccando sul pulsante Dettaglio fattura, verrà proposto a video l’elenco delle prestazioni legate alla fattura scelta.
Accedendo all’evento FormClosing
di tutti i form si potrebbe richiamare, qualora lo si desideri, le varie Sub ClientiBindingNavigatorSaveItem_Click(sender,e)
, FattureBindingNavigatorSaveItem_Click(sender,e)
e PrestazioniBindingNavigatorSaveItem_Click(sender,e)
che consentono di memorizzare sempre le modifiche operate attraverso i DataGridView.
Ricordiamo che la chisura di un qualsiasi form può essere annullata utilizzando l’istruzione e.Cancel = True
all’interno dell’evento FormClosing
.
Quest’istruzione potrebbe risultare particolarmente utile nel momento in cui si stia sviluppando un’applicazione per la quale sia necessario verificare la correttezza dei dati inseriti dall’utente prima di memorizzarli effettivamente all’interno del database.
Nel caso in cui questi non risultassero corretti (si può utilizzare semplicemente una o più “if” all’interno dell’evento FormClosing
), si può impedire la chiusura del form (e.Cancel = True
) visualizzando magari un messaggio d’errore (MessageBox.Show
).
I DataGridView possono essere liberamente personalizzati, sia per quanto riguarda il layout (colori, fonti di carattere, dimensioni delle colonne, allineamento, e così via) sia per ciò che concerne il comportamento.
(cliccare sul link “Download” posto in calce alla stessa).
Per intervenire sulla larghezza di ciascuna colonna colonna di un DataGridView è sufficiente cliccare, al solito, sul link Modifica colonne quindi modificare il valore assegnato alla proprietà Width.
Affinché la larghezza dell’ultima colonna a destra venga automaticamente aumentata sino a coprire l’intero spazio disponibile, è sufficiente ricorrere alla proprietà AutosizeMode impostandola su Fill
.
Altri interessanti parametri legati al “look” della griglia dati sono reperibili facendo riferimento alla proprietà DefaultCellStyle. Cliccando sul pulsante “…”, lo sviluppatore ha la possibilità di scegliere i colori per le varie colonne, l’allineamento del testo da utilizzare, se il testo debba andare automaticamente a capo (WrapMode).
L’altezza delle righe può essere variata ricorrendo alla proprietà RowTemplate, Height del DataGridView.
Per evitare la visualizzazione di errori ben poco “amichevoli” relativi all’utilizzo del DataGridView, è consigliabile utilizzare l’evento DataError
.
Se l’utente, ad esempio, inserisce una stringa testuale in una colonna che attende un valore numerico, l’applicazione Visual Basic 2005 visualizza un messaggio d’errore simile al seguente:
Nell’evento DataError
del DataGridView, si può pensare di inserire, quindi, un messaggio d’errore più facilmente intellegibile: