Passare dei dati filtrati ad un Report

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 :...(

powered by IMHO Omar "Bromarock" Damiani

Print | posted @ martedì 7 febbraio 2006 01:41

Comments on this entry:

Gravatar # re: Passare dei dati filtrati ad un Report
by GHIU at 18/12/2008 12:10

Before you battle fiesta online, check out your character stats. Hit “C” or click the Character icon in the bottom right corner of the fiesta online gold screen. You will see the following character attributes:
Comments have been closed on this topic.