Filtro con combobox multiple su righe datagridview (VB.NET)

martedì 26 maggio 2009 - 12.42

paosao Profilo | Newbie

In VB.NET

Ho una datagridview con una serie di campi che vengono prelevati da tabelle su db.All'interno di ogni riga ho l'esigenza di effettuare un filtro in base a dei valori di diverse combobox. Il filtro che faccio funziona, il problema nasce quando vado a settare il valore che filtro sul campo.Il filtro deve funzionare riga per riga.Invece ogni volta che mi sposto su un'altra riga si stravolge il filtro.

Vi posto il codice:

' DataGridView16 è la mia datagridview
'IDLIVELLODataGridViewTextBoxColumn1 è la combo ke contiene l'ID del livello ke in base al valore di CompetenzeDescr deve dare determinati valori
'CompetenzaDescr è la combo ke contiene le descrizioni delle competenze......
'successivamente in base al valore di IDLIVELLO devo filtrare DESCRLIVELLODataGridViewTextBoxColumn1 con solo i valori relativi all'idlivello specificato




Private Sub DataGridView16_CellBeginEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles DataGridView16.CellBeginEdit



If DataGridView16.Columns(e.ColumnIndex).Name = "IDLIVELLODataGridViewTextBoxColumn1" Then

Dim t2 As String = DataGridView16.Item("CompetenzaDescr", e.RowIndex).Value.ToString
IDLIVELLODataGridViewTextBoxColumn1.DataSource = FILTEREDCOMPETENZELIVELLIFILTERBindingSource
FILTEREDCOMPETENZELIVELLIFILTERBindingSource.Filter = "IDCOMPETENZA = " & t2


End If

If DataGridView16.Columns(e.ColumnIndex).Name = "DESCRLIVELLODataGridViewTextBoxColumn1" Then

Dim t3 As String = DataGridView16.Item("CompetenzaDescr", e.RowIndex).Value.ToString
.DataSource = FILTEREDCOMPETENZELIVELLIFILTERBindingSource
FILTEREDCOMPETENZELIVELLIFILTERBindingSource.Filter = "IDCOMPETENZA = " & t3


End If

End Sub

Spero ke possiate darmi una mano (non sono molto esperto)

grazie

Jeremy Profilo | Guru

Ciao Paolo.
So che ti chiedo molto .... puoi fare un esempio pratico del problema??

Facci sapere...
Ciao.

paosao Profilo | Newbie

ok...
se avete un'altra soluzione al mio problema accetto volentieri
questo è quello ke dovrei fare:
ho due tabelle:(competenze e competenze_livelli)
COMPETENZE: idcompetenza, descr_competenza (questi soni i campi)
COMPETENZE_LIVELLI : idcompetenza, idlivello, descr_tipo_livello, descr_livello

a questo punto carico questi dati in una datagridview....

ora ho quindi una datagridview con tante righe quante sono le competenze

per ogni riga della datagrid ho quindi descr_competenza ---- descr_tipo_livello ---- descr_livello

quello ke devo fare è ke per ogni riga in base al valore di descr_competenza nella combobox descr_tipo_livello mi devono uscire solo i valori legati alla competenza
poi la combobox descr_livello deve a sua volta visualizzare solo i valori legati a descr_tipo_livello di quella determinata competenza

spero di essere stato un pò più chiaro......

Jeremy Profilo | Guru

Ciao Paolo.
Siccome questa settimana, sarà il caldo, ma faccio un pò fatica a comprendere i problemi ..... fammi capire bene ..... Vorresti che in base alla riga del datatgridview in cui ti posizioni si aggiorni la combobox con i dati relativi alla competenza di quella riga???
Facci sapere...
Ciao

paosao Profilo | Newbie

Capisco ke può essere complicato spiegarsi....
provo ad inviare delle immagini in allegato...

grazie per la pazienza

Jeremy Profilo | Guru

Ciao Paolo.
Mi dispiace ma il file allegato non funziona....mi dice che la cartella compressa non è valida....
Se vuoi mandarmele via mail ..... puoi mandarle a questo indirizzo
tiziano[at]mtimpianti.net

Ciao

Jeremy Profilo | Guru

Ciao Paolo.
Come ti ho anticipato via e-mail, il problema nasce dal fatto che tu non tieni conto che le combobox che fanno parte della riga del datagrid, hanno bisogno di un filtro diverso ognuna.....non puoi quindi applicare il filtro ad un oggetto il quale riferimento è lo stesso oggetto(BindingSource).
In questo caso, vedo molto utile l'utilizzo di LINQ....per recuperare un insieme di elementi, in base ad alcuni criteri, ma direttamente sulla datatable ...... ti faccio un esempio che dovrai poi adattare alle tue esigenze:
IDLIVELLODataGridViewTextBoxColumn1.DataSource =From Elementi In TuaDataTable.Rows Where _ DirectCast(Elementi, DataRow)("IDCompetenza").ToString = "Valore" _ Select Elementi

In questo modo ogni DataSource della ComboBox avrà un suo insieme, di elementi filtrati, ma *sconnesso* dall'origine dati (in questo caso la datatable)

Il codice non ho avuto modo di provarlo, ma dovrebbe funzionare...
Eventualmente ....Facci sapere...che lo aggiustiamo.
Ciao

paosao Profilo | Newbie

come avevo già specificato non sono molto esperto...
potresti darmi qualche dritta in più su come fare e dove inserire questa parte di codice?

grazie ancora

Jeremy Profilo | Guru

Ciao Paolo.
Dammi tempo domani ... e vedo di darti più info

Ciao

Jeremy Profilo | Guru

Ciao Paolo.
prova a dare un occhio a questo progettino di esempio se può esserti utile.

Facci sapere...
Ciao

paosao Profilo | Newbie

Grazie.....potrebbe essere una soluzione.
Ma volendo usare il bindingsource e non le datatable come posso fare?
Vorrei prendere i dtai direttamente dalle tabelle tramite il bindingsource

Jeremy Profilo | Guru

Ciao Paolo.
Se vuoi avere il bindingsource come origine dati, basta che sostituisci, nella query linq, la datatable con il bindingsource.....ed il cast lo esegui su datarowview anziche datarow.

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Facci sapere...
Ciao

paosao Profilo | Newbie

Mi serve ancora qualke aiuto....nn riesco a farlo funzionare

Riepilogando...
praticamente la mia datagrid prende i valori da tabelle collegate e più precisamente ho un bindingsource tra competenze e competenze_livelli.
Quindi su questo unico bindig source ho tutti i dati che mi occorrono...

Jeremy Profilo | Guru

Ciao Paolo.
Passato qualche giorno, ho perso un pò il filo del discorso .... ad ogni modo se hai un solo BindingSource, tutto dovrbbe ridursi a questo:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Eventualmente .... facci sapere ...
Ciao.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5