Anche in questo caso il post nasce da una problematica
che mi ha fatto (inutilmente) perdere 19000 ore e più...
Eh si...dopo mesi ancora non riesco ad avere un buon ritorno in produttività
con .Net ma sopporto e vado avanti (spero).
Il problema questa volta è questo: ho creato un Report basato su un mio
DataSet (attenzione che nei report il significato di DataSet si avvicina, per
non dire che coincide, con quello di DataTable).
Ho messo i miei vari
campettini, linee, rettangoli e quant'altro...
Nella mia form, assegnavo alla DataSource del mio Report la mia BindingSource
ed funziona tutto alla grande.
Poi ho aggiunto la funzionalità di ricerca alla form e quindi la mia
BindingSource viene filtrata in base, appunto, ai parametri di ricerca.
Con mia sorpresa (e orrore) scopro che però al Report vengono passati
comunque tutti i record e non solo quelli presenti nella BindingSource filtrata
(chissà per quale magia invece nelle DataGridView il filtro funziona
perfettamente, per fortuna).
Come fare quindi a filtrare i dati anche nella stampa?
Perdo all'incirca 5 ore per capire come passare solo i record che mi
interessano.
La DGV ritorna solo un array di DataViewRow, così come la
BindingSource
Decido allora di instanziare una DataTable ma non ho niente su
cui ciclare le DataRow e aggiungerle.
Stessa cosa (anzi peggio) se provo con
il mio DataSet tipizzato.
Vado su MSDN, nulla.
Vado sui forum, solo domande di gente che non è
riuscita.
Ma niente risposte.
Entro prima nella frustazione, poi nella delusione mentre a 2 metri da me mio
fratello sta quasi per concludere i calcolo per il salto nell'iperspazio, io non
riesco a fare 1+1.
Provo a ragionare ancora un po': perchè la BindingSource non passa i dati
filtrati?
La proprietà DataSource della mia BindingSource è settata al mio DataSet
tipizzato.
E i DataSet, per definizione, non sono filtrati.
E questo
significa che al Report viene passato tutto il DataSet, quindi niente
filtro.
Intravedo che sto per arrivarci.
Cosa esiste di filtrato/filtrabile?
Le DataView.
Ma le DataView altro non sono che delle proprietà della DataTable.
Quindi
dal DataSet mi becco la DataTable, da quest'ultima la DefaultView, la filtro con
lo stesso filtro della BindingSource e la passo al Report.
Funzionerà?
Beh...il codice è questo:
Private Sub SetFiltroReport(ByVal Filtro As String)
Dim RepDS
As New
Microsoft.Reporting.WinForms.ReportDataSource
RepDS.Name = "dsGesNeg_Articolo"
'RepDS.Value = Me.BindingSource1
Dim ds As New System.Data.DataSet
Dim dv As New System.Data.DataView
ds =
CType(Me.BindingSource1.DataSource, System.Data.DataSet)
If ds IsNot Nothing Then
dv = ds.Tables("Articolo").DefaultView
dv.RowFilter = Filtro
RepDS.Value = dv
Me.ReportViewer1.LocalReport.DataSources.Clear()
Me.ReportViewer1.LocalReport.DataSources.Add(RepDS)
End If
Me.ReportViewer1.RefreshReport()
End Sub
E a me ha
funzionato...;)
Però...cavolo...avrei dovuto metterci mooooolto meno
:...(