vb.net ReportViewer - 以编程方式生成报告

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/14940074/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-09 16:41:19  来源:igfitidea点击:

ReportViewer - Programmatically generate report

vb.netparametersreportviewer

提问by Alex

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.

我正在尝试使用内置的报告查看器控件来生成我的自定义报告。Crystal Reports 很重,并且不能在所有客户端计算机上运行,​​因此我正在尝试构建 microsoft report。

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:

所以我的数据集被称为“Programs”,它包含一个 DataTable,其中有一列名为“ProgramName”。我添加程序的名称,最后返回这里要使用的数据集:

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

我的名为“rptReport”的报告包含一个名为“programName”的参数字段。现在我写在“测试”中并且它有效。我的问题是,我希望它通过循环打印出所有程序名称,但我不太确定如何去做...

采纳答案by Alex

Here is how I fixed it by the way:

顺便说一下,这是我修复它的方法:

I call my "Developpement_GenerateNomDesc" method using:

我使用以下方法调用我的“Developpement_GenerateNomDesc”方法:

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.

rvRDLC 是我的 ReportViewer 控件名称。确保将参数添加到您的报告中。您可以使用 Report.rdlc 的 UI 执行此操作。或者您可以以编程方式进行,是一个很好的指针。

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.

这将使用数据集“dsPrograms”生成报告以填写 report.rdlc 中的信息。数据集是使用我的类对象“clsProgram”填充的,其中包含有用的信息,如名称、描述、DateCreated 等。