2013-02-18 2 views
2

Я пытаюсь использовать встроенный элемент управления Просмотр отчетов для создания собственных отчетов. Кристаллические отчеты тяжелы и не работают на всех клиентских компьютерах, поэтому я даю сборку отчетов Microsoft.ReportViewer - программно сгенерированный отчет

Цель настоящего отчета - распечатать список всех программ. Они aregotten из базы данных и хранятся в списке следующим образом:

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 

Так что мой набор данных под названием «Программы» и содержит 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() 

Мой доклад под названием «rptReport» содержит поле параметра с именем «ProgramName». Прямо сейчас я пишу в «Тест», и он работает. Мой вопрос, я хочу, чтобы напечатать все имена программ через петлю, но я не совсем уверен, как идти о выполнении этого ...

+0

У вас есть много вещей, которые вам нужны: вам не нужно как список, так и набор данных - вы можете использовать список или строго типизированный набор данных, но вам нужно связать отчет с этим в дизайнере ; поэтому вы должны использовать строго типизированный ds- он должен быть доступен во время разработки. Забудьте о параметрах на данный момент. – peterG

ответ

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. Или вы можете сделать это программно, 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 

Это создает отчет, используя DataSet «dsPrograms», чтобы заполнить информацию в report.rdlc. Набор данных заполняется с помощью моего объекта класса «clsProgram», который содержит полезную информацию, такую ​​как Name, Description, DateCreated и т. Д.

+0

Любые причины не просто привязываться к Progams и пропускать datset? – peterG

+0

@peterG Мой SQL Server был слишком стар, и я не мог подключить его напрямую к моему проекту. Я должен был иметь SQL Server 2005 или старше. Вот почему я должен был сделать это с помощью DataSet. – Alex

+0

Я имел в виду, что вы могли бы создать источник данных в окне источников данных из вашего списка (clsProgram) и использовать это непосредственно в отчете вместо промежуточного шага создания набора данных и заполнения его из этого. т.е. вы не ограничены строго типизированными наборами данных для отчетов, вы также можете использовать коллекции объектов. – peterG

Смежные вопросы