【问题标题】:ReportViewer - Programmatically generate reportReportViewer - 以编程方式生成报告
【发布时间】:2013-02-03 02:33:05
【问题描述】:

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

此报告的目标是打印所有程序的列表。它们从数据库中获取并存储在一个列表中,如下所示:

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

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

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()

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

【问题讨论】:

  • 你有很多事情要做——你不需要列表和数据集——你可以使用列表,或者强类型的数据集,但是你需要绑定报表在设计师中对此;这就是为什么您必须使用强类型 ds - 它必须在设计时可用。暂时忘记参数。

标签: vb.net parameters reportviewer


【解决方案1】:

顺便说一下,我是这样解决的:

我使用以下方法调用我的“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 是我的 ReportViewer 控件名称。确保将参数添加到您的报告中。您可以使用 Report.rdlc 的 UI 执行此操作。或者您可以通过编程方式完成,here 是一个很好的指针。

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

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

【讨论】:

  • 有什么理由不绑定到 Progams 并跳过数据集?
  • @peterG 我的 SQL Server 太旧,无法直接连接到我的项目。我必须拥有 SQL Server 2005 或更早版本。这就是为什么我必须通过 DataSet 来做。
  • 我的意思是你可以从你的列表(clsProgram)的数据源窗口中创建一个数据源并直接在报告中使用它,而不是创建数据集并从中填充它的中间步骤。即,您不仅限于报表的强类型数据集,您也可以使用对象集合。
  • @peterG 哦,我明白你现在的意思了,是的。这是我学习 DataSets 和 ReportViewer 的时候。我生成报告的方法发生了很大变化:)
猜你喜欢
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多