Capitolo 4. Controllo delle Colonne

                                                                                                                                                                                                                           

4.1 Impostazione delle Colonne

 

Negli Esercizi precedenti abbiamo visto un DataGrid che visualizza i Records della Tabella prescelta in modo aderente alla struttura della Tabella stessa: i Fields hanno stessa la sequenza che hanno nella Tabella, le dimensioni delle Colonne del DataGrid sono tutte uguali indipendentemente dalle dimensioni dei Fields e le intestazioni delle Colonne (Headers) sono identiche ai nomi dei Fields delle Tabella.

 

É venuto il momento di prendere in mano questi parametri. Creiamo allora una nuova Cartella ESERCIZIO_04_ADO e disponiamo nel Form1 il solito DataGrid1.

 

Per rendere un po' più interessante il Progetto, aggiungiamo anche un Modulo.

I moduli sono una specie di magazzino in cui si possono depositare inizializzazioni, dichiarazioni e subroutines di vario genere, con il vantaggio che tutti questi oggetti sono visibili da qualunque parte del Progetto.

 

Allora nella finestra “DICHIARAZIONI” del Modulo scriviamo:

 

' global generali

'-------------------

Global pathmdb

Global Cn1 As New ADODB.Connection

 

' recordset aut

'-------------------

Global aut11 As New ADODB.Recordset

Global aut21 As New ADODB.Recordset

Global autvuoto

 

' recordset tit

'-------------------

Global tit11 As New ADODB.Recordset

Global tit21 As New ADODB.Recordset

Global titvuoto

 

E con questo abbiamo inizializzato un bel po' di variabili che utilizzeremo  nel corso del nostro Progetto.

 

Sempre nel Modulo scriviamo inoltre una Subroutine a cui daremo il nome (arbitrario) di “APRIPROGETTO” a cui affidiamo il compito di effettuare i vari interventi e definizioni necessari quando si lancia il Progetto. Per ora il Progetto é semplice e la Subroutine si limita a scrivere:

 

Sub apriprogetto()

 

'path

'--------------------

pathmdb1 = "C:\GRIGLIE_ADO\ARCHIVIODATI\BIBLIO.MDB"

 

'Connessione

'--------------------

Cn1.CursorLocation = adUseClient

Cn1.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & pathmdb & ""

 

End Sub

 

Cominciamo ora a lavorare sul Form1 e scriviamo per l’evento “FORM LOAD” le seguenti istruzionI:

 

Private Sub Form_Load()

 

'aperura progetto

'---------------------

apriprogetto

 

'definizione del Recordset

'---------------------

tit11.Open "Select * from TITLES order by TITLE", Cn1, adOpenStatic, adLockOptimistic

Set DataGrid1.DataSource = tit11

 

'datagrid1

'-------------------------------------------

DataGrid1.HoldFields

DataGrid1.AllowUpdate = False

DataGrid1.Caption = "File Titoli per Titolo"

DataGrid1.Font.Bold = True

DataGrid1.HeadFont.Bold = True

DataGrid1.AllowRowSizing = False

 

caricacolonne

End Sub

 

Commentiamo ora le istruzioni che abbiamo scritto.

 

-        La prima istruzione lancia la Subroutine APRIPROGETTO che sappiamo essere presente nel modulo e che definisce la variabile PATHMDB, cioè la collocazione di BIBLIO.MDB. Qui si apre anche la connessione “Cn”.

 

-        Il successivo gruppo di istruzioni apre, con modalità ormai note, un RecordSet ADO che interessa la tabella TITLES su cui vogliamo ora lavorare e ne fissa l’ordinamento a TITLE.

 

-        Le caratteristiche (Fields, Tipo, Dimensioni etc) della Tabella TITLES in BIBLIO.MDB possono al solito essere osservate con il VDM o con l’Access.

 

-        Si passa ora a personalizzare il DataGrid. Per prima cosa si lancia il Metodo Holdfields che cancella tutte le caratteristiche di inizializzazione del DataGrid rendendolo cosi’ disponibile a riceverne delle nuove.

 

-        Si impedisce che l’utente possa fare modifiche ai Records agendo sul DataGrid (AllowUpdate). Infatti, operare direttamente sui Records da DataGrid é decisamente non professionale e  fastidioso perché e’ senza ritorno e può causare notevoli mali di testa. Vedremo in seguito come operare in sicurezza.

 

-        Si definisce inoltre la Caption cioè il Titolo del DataGrid e, se si vuole,  i caratteri Bold, ben visibili, rispettivamente dei dati (DataGrid1.Font.Bold) e delle intestazioni colonne (DataGrid1.HeadFont.Bold).

 

-        Si impone infine la proprietà RowSizing a False per evitare il fastidioso scarrellamento delle righe quando si toccano i bottoni di selezione Record.

 

Segue ora una Subroutine che dobbiamo aggiungere nel Form, sezione “generale”, assegnandoli il nome (arbitrario) CARCICOLONNE. Per renderla accessibile anche da altri Form  dichiariamola non “PRIVATE” Ecco la Routine:

 

 

Sub caricacolonne()

 

'caricacolonne

'-----------------

For i = 0 To DataGrid1.Columns.Count - 2

DataGrid1.Columns.Remove 0

Next

 

For i = 0 To 3

DataGrid1.Columns.Add (i)

DataGrid1.Columns(i).Visible = True

Next

 

DataGrid1.Columns(0).DataField = "TITLE"

DataGrid1.Columns(0).Caption = "Titolo"

DataGrid1.Columns(0).Width = 2500

 

DataGrid1.Columns(1).DataField = "ISBN"

DataGrid1.Columns(1).Caption = "Cod.ISBN"

DataGrid1.Columns(1).Width = 1500

 

DataGrid1.Columns(2).DataField = "YEAR PUBLISHED"

DataGrid1.Columns(2).Caption = " Anno"

DataGrid1.Columns(2).Width = 700

 

DataGrid1.Columns(3).DataField = "PUBID"

DataGrid1.Columns(3).Caption = " Cd.Ed."

DataGrid1.Columns(3).Width = 800

 

'allineamento

'--------------------

DataGrid1.RowDividerStyle = 4

For i = 0 To 3

DataGrid1.Columns(i).DividerStyle = 4

DataGrid1.Columns(i).Alignment = 0

Next

 

'allineamento numeri

'--------------------

DataGrid1.Columns(2).Alignment = 2

DataGrid1.Columns(3).Alignment = 2

 

'rebind

'--------------------

DataGrid1.Columns(4).Visible = False

DataGrid1.ReBind

 

End Sub

 

Questa Subroutine contiene una serie di istruzioni che servono a personalizzare e a definire il DataGrid. Prima di commentarle ricordiamo che cosa sono gli oggetti Columns e Columns(x).

Ogni DataGrid porta associato un oggetto Columns, cioe’ una Collezione di Colonne. E’ come se ogni DataGrid fosse proprietaria di un libro. Questa Collezione e’  dotata di  Proprieta’ sue specifiche, per esempio la “COUNT”.

 

La Collezione e’ a sua volta caratterizzata da un numero x di oggetti ad essa associati, un po’ come le pagine del libro. Questi oggetti sono le colonne del DataGrid e sono identificati come Columns(x) ove l’indice  “x” rappresenta l’ordine della colonna a cominciare da zero a salire.

 

Per  esempio un DataGrid con 4 colonne e’ caratterizzato da un oggetto Columns il cui “COUNT” e’ 4 e da quattro oggetti Column(x) con indice da zero a tre.

 

Analizziamo allora le istruzioni di “CARCACOLONNE”,

 

-        Si comincia con l’ eliminare qualunque colonna il DataGrid possegga per creare una situazione pulita e poter poi impostare il numero di colonne da noi desiderato. Per fare questo si fa uso dell’ oggetto Columns associato al DataGrid. Una proprietà di questo oggetto é la Columns.Count che conta quante colonne sono presenti e poi con il metodo Columns.Remove si procede a svuotare il DataGrid.

 

-        Si lavora ora con le Columns(x). Ne vogliamo creare quattro. A questo provvede il ciclo FOR/NEXT di 4 giri (appunto da zero a tre) che ogni volta crea una colonna, rispettivamente Columns(0),(1),(2),(3) usando per questo il metodo Add dell’oggetto Columns associato al DataGrid. Anche le Columns(x) hanno le loro proprietà ed é su queste che lavoreremo.

 

-        Si procede quindi a personalizzare ciascuna Columns(x) così creata definendone le proprietà:il DataField, la Caption e la Width. Questo é il momento nel quale si sceglie quali Fields visualizzare, il loro ordine di incolonnamento, la larghezza della colonna ed il titolo della stessa.

 

-        Si passa quindi a definire l’aspetto delle colonne,cioè il RowDividerStyle del DataGrid  (per esempio codice 4, incassato) ed il DividerStyle delle Column(x) (per esempio tutte codice 4, incassato) nonché l’allineamento dei dati (tutti con codice zero, a sinistra).

 

-        Se sono presenti colonne in cui sono presenti dati di tipo numerico, é più estetico mandarli a destra, codice 1 oppure al centro, codice 2. É questo il caso della Column(2) dato che l’Anno é numerico e il caso della Column(3) dato che anche il Codice Editore é numerico.

 

-        Alla fine si lancia il metodo “REBIND” per far incorporare queste modifiche nel DataGrid.

 

É fatta. Possiamo lanciare il Programma ed osservare il DataGrid personalizzato che si carica all’avvio del Form  (Form Load).

 

 

 

Si noti infine una interessante Proprieta' dell'elemento "COLUMNS"  e cioe' la "NUMBERFORMAT". Essa permette di formattare l'aspetto dei campi numerici con le stesse regole dell'istruzione "FORMAT" che per comodita' riassumiamo di seguito:

 

 

txtKalcolo = Format(Kalcolo, "### ### ###.000")
- formatta anche i negativi ma NON permette sbianco
- per indicare la separazione interi/decimali si puo' scegliere sia "," che ".")

- il numero di zeri dopo la virgola  indica il numero di decimali che si vogliono mostrare

- anche questi decimali possono essere formattati. Es: ".....000 000" mostra 6 decimali (2 gruppi di tre)

- in caso di zero scrive .000

txtKalcolo = Format(Kalcolo, "### ### ###.000 ###")
- come sopra, pero':
- in caso di cifre decimali scrive SEMPRE le prime tre e poi scrive l'altro tripletto solo se esso e' divero da zero

 

txtKalcolo = Format(Kalcolo, "### ### ##0.000")
- formatta anche i negativi ma NON permette sbianco
- in caso di zero scrive 0.000

txtKalcolo = Format(Kalcolo, "### ### ###.000;;#")
- formatta anche i negativi (solo con doppio ;) e permette sbianco (# finale)
- in caso di zero sbianca

 

txtKalcolo = Format(Kalcolo, "### ### ###.000;;0")
- formatta anche i negativi (solo con doppio ;) e non permette sbianco
- in caso di zero scrive  -->  0

 


Si provi (a solo titolo di esempio didattico)  a formattare il campo numerico "PUBID":

 

DataGrid1.Columns(3).NumberFormat = "### ### ###.000"
 

 

 

4.2 Modifica delle Colonne

 

Ancora a scopo didattico si puo' preparare anche un’altra Routine, la “CARICACOLONNE2”, un po’ diversa, tanto per osservare il comportamento del DataGrid.

 

Questa Routine viene lanciata da un nuovo bottone, “CMDCOLONNE2” in cui si provvede al cambio di ordinamento del Recordset.

 

Private Sub cmdColonne2_Click()

 

'definizione del Recordset

'---------------------

tit11.Close

tit11.Open "Select * from TITLES order by ISBN", Cn, adOpenStatic, adLockOptimistic

Set DataGrid1.DataSource = tit11

 

'datagrid1

'-------------------------------------------

DataGrid1.Caption = "File Titoli per ISBN"

caricacolonne2

 

End Sub

 

 

L a Routine “CARICACOLONNE2” e’ simile alla “CARICACOLONNE” per cui non la riportiamo per brevita’.

 

4.3 Apertura in VB.NET

 

Vogliamo anche qui  preparare un Progetto che si comporti nello stesso modo sotto Visual Basic Express.

 

Prepariamo  nuova Cartella/Directory all’interno della Cartella GRIGLIE_ADO con il nome ESERCIZIO_04_NET.

 

Partiamo con il Form a cui daremo un aspetto simile a quello visto sopra.

 

 

La Routine di apertura di “TIT11” e’ identica a quanto visto per “AUT11” ove al posto di “AUTHORS” si e' aperta la Tabella  “TITLES”.

I nomi degli Adapters son quindi stati modificati di conseguenza.

 

Anche qui abbiamo introdotto un Modulo ove trovano posto le definizioni dei DataSet, Adapter etc della Tabella “TITLES” di “BIBLIO.MDB”, nonche’ la Routine “APRIPROGETTO” in analogia a quanto visto per il DataGrid.

 

Sub apriprogetto()

 

  'generali

        '--------------------

        pathmdb = "C:\GRIGLIE_ADO\ARCHIVIODATI\BIBLIO.MDB"

        acapo = Chr(13) + Chr(10)

 

    End Sub

 

     

Dopodiché si impostano alcune variabili per il DataGridView, in modo analogo a quanto visto sopra per il DataGrid.

 

'datagridview1

        '-------------------------------------------

        caricacolonne()

        lblHeader.Text = "per Titolo"

        DataGridView1.ReadOnly = True

        DataGridView1.AllowUserToOrderColumns = True

        DataGridView1.AllowUserToResizeRows = False

        DataGridView1.AllowUserToAddRows = False

 

La Routine “CAICACOLONNE” e’ un po’ diversa dalla sua omologa in VB6. Vediamola:

 

  Sub caricacolonne()

 

        'rimuove colonne

        '-----------------

        Dim i As Integer

        For i = 0 To DataGridView1.Columns.Count - 1

            DataGridView1.Columns(i).Visible = False

        Next

 

        Dim C1 As New DataGridViewTextBoxColumn

        DataGridView1.Columns.Insert(1, C1)

        DataGridView1.Columns(1).DataPropertyName = "TITLE"

        DataGridView1.Columns(1).HeaderText = "Titolo"

        DataGridView1.Columns(1).Width = 200

        'DataGridView1.Columns(1).Frozen = True

        'DataGridView1.Columns(1).DividerWidth = 1

        'DataGridView1.Columns(1).AutoSizeMode = _

        'DataGridViewAutoSizeColumnMode.AllCellsExceptHeader()

 

        DataGridView1.Columns(1).ToolTipText = "Ciao Ciao"

       Dim C2 As New DataGridViewTextBoxColumn

        DataGridView1.Columns.Insert(2, C2)

        DataGridView1.Columns(2).DataPropertyName = "ISBN"

        DataGridView1.Columns(2).HeaderText = "Cod.ISBN"

        DataGridView1.Columns(2).Width = 150

 

        Dim C3 As New DataGridViewTextBoxColumn

        DataGridView1.Columns.Insert(3, C3)

        DataGridView1.Columns(3).DataPropertyName = "YEAR PUBLISHED"

        DataGridView1.Columns(3).HeaderText = "Anno"

        DataGridView1.Columns(3).Width = 70

 

        Dim C4 As New DataGridViewTextBoxColumn

        DataGridView1.Columns.Insert(4, C4)

        DataGridView1.Columns(4).DataPropertyName = "PUBID"

        DataGridView1.Columns(4).HeaderText = "Cod.Ed."

        DataGridView1.Columns(4).Width = 70

 

        'allineamento numeri

        '--------------------

        DataGridView1.Columns(3).DefaultCellStyle.Alignment = _

        DataGridViewContentAlignment.BottomRight

 

        DataGridView1.Columns(4).DefaultCellStyle.Alignment = _

        DataGridViewContentAlignment.BottomRight

    End Sub

 

 

Per ogni colonna si scrive una Routine di creazione (variabile a nome arbitrario C1, C2, etc), l’inserimento, la definizione del Field da Visualizzare, la Caption della Colonna e la sua dimensione in Pixels.

 

Per le colonne con valori numerici si puo’ definire un allineamento a destra.

 

Sono disponibili molte opzioni non presenti nel DataGrid, ad esempio:

 

-        La possibilita’ di definire vari tipi di colonna , Combo, checkBox, etc. Noi ci limiteremo solo al tipo “TextBox”.

 

-        La Proprieta’ “Frozen” che blocca la coloona mentre le altre scorrono.

 

-        La Proprieta’ “DividerWidht” che seve a marcare il punto di Frozen/Scorrevole.

 

-        La Proprieta’ “Autosize” che allarga la colonna fino ad ospitare la larghezza massima dei dati del Field mostrato.

 

-        La Proprieta0 “ToolTip” che fa apparire un messaggio quando si passa col mouse sell’header della colonna.

 

 

4.4 Modifica delle colonne del DataGridView

 

Anche qui possiamo collocare un bottone “CMDCOLONNE2” che provvede  a modificare l’ordinamento di “TIT11” e a lanciare la nuova “CARICACOLONNE2”.

 

 

Private Sub cmdColonne2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdColonne2.Click

        SelezTit = "Select * from TITLES order by ISBN"

        titfresca()

        lblHeader.Text = "per Codice ISBN"

        caricacolonne2()

    End Sub

 

Come gia’ esperimentato, occorre una Routine di rinfresco “TITFRESCA” simile a qella gia’ vista “AUTFRESCA”.

 

Il miglior posto per mettere questa Routine e’ il Modulo “MODULO1” che abbiamo aggiunto al Progetto.

 

 Sub titfresca()

        'chiude

        '----------------------

        Ds_BIBLIO.Clear()

        Dt_TITLES.Clear()

        Cb_TITLES.Dispose()

 

        'Dataset

        '----------------------

        Da_TITLES = New OleDb.OleDbDataAdapter(SelezTit, Cn)

        Da_TITLES.Fill(Ds_BIBLIO, "BIBLIO")

 

        'Table

        '--------------------

        Da_TITLES.Fill(Dt_TITLES)

        Cb_TITLES = New OleDb.OleDbCommandBuilder(Da_TITLES)

        tit11.DataSource = Dt_TITLES

        MaxRowsTit = Ds_BIBLIO.Tables("BIBLIO").Rows.Count

        Form1.DataGridView1.DataSource = tit11

 

 End Sub

 

 

 

Fine del Capitolo 4. Controllo delle Colonne