Blog di Bruno Fortunato

.Net Developer (and many more) - Direct3D Lover
There are 10 kind of person in the world, who understand binary code and who not!

June 2006 - Posts

Introduzione alla grafica 3d con WPF
Sono sempre stato appassionato di grafica 3D ed onestamente quando ho visto le potenzialità di Windows Presentation Foundation in questo ambito (ma non solo) non ho potuto fare a meno di addentrarmi nel merito.

Ecco quindi il mio secondo articolo

Buona lettura

Bruno Fortunato
Relazioni tra ComboBox in un DataGridView
Ciao a tutti.

Qualche giorno fa mi sono trovato di fronte ad un piccolo problema, e siccome dopo la cena di ieri sera con i miei "colleghi di community" sono di buon umore, ho deciso di postare qui la soluzione adottata sperando possa essere utile a qualcuno!

In pratica, mi sono trovato di fronte a 2 ComboBox in un GridView i quali dipendevano l'un dall'altro da una relazione in un database.

Per intenderci... una tipica relazione come potrebbe essere quella delle regioni di italia con le rispettive province.

Bene...

Diamo per scontata la presenza di un dataset contentente le tabelle (regioni, province), 2 BindingSource (bsRegioni, bsProvince) che puntano alle suddette tabelle e quindi, un DataGridView (gridView) con 2 DataGridViewComboBoxColumn, cbRegioni con data source bsRegioni e cbProvince, ovviamente, con bsProvince.

Nella tabella contenente le province ci saranno tutte le province d'italia e ci sara' un altro campo ( id_regione ) che appunto legherà la provincia alla regione.

Quello di cui noi abbiamo bisogno è quindi filtrare le province in cbProvince in base alla selezione in cbRegioni.

Per far cio' abbiamo bisogno di un altro BindingSource, sempre legato alla tabella Province, sul quale applicare i filtri tramite la proprietà Filter.

In pratica avremo 3 binding source:

BindingSource bsRegioni = new BindingSource(dataSet, "regioni");
BindingSource bsProvince = new BindingSource(dataSet, "province");
BindingSource bsProvinceFiltrate = new BindingSource(dataSet, "province");


A questo punto dobbiamo intercettare l'evento CellBeginEdit del gridView nel quale intercettare la cella contenente la provincia ed applicare il filtro.

private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
        {
            if (e.ColumnIndex = this.cbProvince.Index) //controllo se sto modificando la cella giusta
            {
                //recupero la cella contenente la regione selezionata
                DataGridViewComboBoxCell cellRegione = (DataGridViewComboBoxCell)dataGridView1[this.cbRegioni.Index, e.RowIndex];

                //recupero la cella contenente la provincia e che sto modificando
                DataGridViewComboBoxCell cellProvincia = (DataGridViewComboBoxCell)dataGridView1[e.ColumnIndex, e.RowIndex];

                //applico il filtro al bindingSource
                this.bsProvinceFiltrate.Filter = String.Format("id_regione = {0}", cellRegione.Value);

                //imposto il datasource corretto alla cella provincia
                cellProvincia.DataSource = this.bsProvinceFiltrate;
            }
        }


Benissimo. Ora la cella dovrebbe essere filtrata.

Per evitare errori di esecuzione è necessario, alla fine della modifica della provincia, reimpostare il bindingSource originale.
Intercettiamo quindi l'evento CellEndEdit del gridView e riportiamo tutto alla "normalita"

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex = this.cbProvince.Index) //controllo se sto modificando la cella giusta
            {
                //recupero la cella contenente la provincia e che sto modificando
                DataGridViewComboBoxCell cellProvincia = (DataGridViewComboBoxCell)dataGridView1[e.ColumnIndex, e.RowIndex];

                //imposto il datasource originale alla cella provincia
                cellProvincia.DataSource = this.bsProvince;
            }
        }


E' tutto.

Spero possa essere utile a qualcuno!

Bruno Fortunato