Alex
Alex

Reputation: 4938

ReportViewer - Programmatically generate report

I am trying to use the built-in Report Viewer control to generate my custom reports. Crystal Reports is heavy and doesn't work on all client computers therefore I'm giving the microsoft report build a try.

The goal of this report is to print a list of all programs. They aregotten from the database and stored in a list like so:

Private Function ProgramDataset() As DataSet
    Dim ds As DataSet = New DataSet("Programs")
    Dim allPrograms As List(Of clsProgram) = clsProgram.GetAll()

    'Build datatable
    Dim table1 As DataTable = New DataTable("Programs")
    table1.Columns.Add("ProgramName")

    For Each program As clsProgram In allPrograms
        table1.Rows.Add(program.Name)
    Next

    ' Create a DataSet. Put the table in it
    ds.Tables.Add(table1)

    Return ds
End Function

So my dataset is called "Programs" and it contains a DataTable with a column named "ProgramName". I add the name of the program and finally return the dataset to be used here:

Dim ds As DataSet = ProgramDataset()
Dim p As New ReportParameter("programName", "Test")
frmReportViewer.ReportViewer1.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Local
frmReportViewer.ReportViewer1.LocalReport.ReportPath = "..\..\Reports\rptReport.rdlc"
frmReportViewer.ReportViewer1.LocalReport.SetParameters(p)
frmReportViewer.ReportViewer1.LocalReport.DataSources.Clear()
frmReportViewer.ReportViewer1.LocalReport.DataSources.Add(New Microsoft.Reporting.WinForms.ReportDataSource("Programs", ds.Tables(0)))
frmReportViewer.ReportViewer1.DocumentMapCollapsed = True
frmReportViewer.ReportViewer1.RefreshReport()
frmReportViewer.Show()

My report named "rptReport" contains a parameter field named "programName". Right now I write in "Test" and it works. My issue is, I want it to print out all program names through a loop but I'm not quite sure how to go about doing that...

Upvotes: 2

Views: 30676

Answers (1)

Alex
Alex

Reputation: 4938

Here is how I fixed it by the way:

I call my "Developpement_GenerateNomDesc" method using:

Public Sub ProgramDeveloppementNameDesc()
    Dim rpJobNo = New ReportParameter("rpTitle", "Liste des programmes et leurs descriptions en développement")
    Dim rpDate = New ReportParameter("rpDate", Date.Now())
    Dim HeaderParams As ReportParameter() = {rpJobNo, rpDate}
    Dim rvRDLC As New frmReportViewerRDLC

    rvRDLC.Developpement_GenerateNomDesc("Developpement_rptNomDesc.rdlc", HeaderParams, "Developpement_rptNomDescDataset")
End Sub

rvRDLC is my ReportViewer control name. Make sure to add the parameters to your report. You can do this using the UI of the Report.rdlc. Or you can do it programmatically, here's a good pointer.

Public Sub Developpement_GenerateNomDesc(ByRef ReportName As String, ByVal HeaderParams As ReportParameter(), ByRef DataSourceName As String)
    Dim ds As New dsPrograms
    Dim sReportDataSource As ReportDataSource
    Dim Programs = clsProgram.GetAll(0, False)

    'Reset the viewer
    rv.Reset()
    rv.LocalReport.ReportEmbeddedResource = "GestionInformatique." & ReportName
    rv.LocalReport.DataSources.Clear()
    sReportDataSource = New ReportDataSource()

    For Each param As ReportParameter In HeaderParams
        rv.LocalReport.SetParameters(param)
    Next

    'Fill the datatable
    For Each program As clsProgram In Programs
        ds.dsProgramDetails.Rows.Add(program.Name, program.Description)
    Next

    sReportDataSource.Name = DataSourceName
    sReportDataSource.Value = ds.dsProgramDetails
    rv.LocalReport.DataSources.Add(sReportDataSource)
    'rv.PrinterSettings.DefaultPageSettings.Landscape = True
    rv.RefreshReport()
    Me.Show()
End Sub

This generates a report using the DataSet "dsPrograms" to fill in the information in the report.rdlc. The dataset is populated using my class object "clsProgram" which contains useful information such as Name, Description, DateCreated and so on.

Upvotes: 1

Related Questions