Я сделал именно это за 4 месяца. Мой код в VB.NET и довольно длинный. Я начал с кода, указанного в GotReportViewer, и построил поверх него. Одним словом, это то, что вам нужно будет сделать:
- Визуализация и RDLC файл в памяти -
используя DataTable (или набор данных, для
множественные отчеты) в качестве ввода
Для этого я создал класс ReportEngine. Это просто набор функций, которые создают файлы RDLC. В этом вся суть операции, а код довольно длинный. Вот некоторые из основных функций, которые я использую. Было бы лучше просто отправить вам мои классы по электронной почте - они очень длинные:
'Data Building variables
Private _reportDataset As DataSet 'Data displayed in report
Private _AllFields As List(Of String) 'All column field names
Private _AllCaptions As List(Of String) 'All column names to display in report (needed for french translation)
Private _reportRDL As MemoryStream 'Report definition file
Private _reportControl As ReportControl 'Control that displays the report
Public Sub LoadReport(ByVal reportDataset As DataSet)
Try
_reportDataset = reportDataset
'check if the datatable contains data
_hasNoData = False
If _reportDataset.Tables(0).Rows.Count = 0 Then
_hasNoData = True
End If
'Get table column fieldnames, captions and widths
_AllFields = GetTableFields(0)
_AllCaptions = GetTableCaptions(0)
'reset RDL file if already existing
If Not (_reportRDL Is Nothing) Then
_reportRDL.Dispose()
End If
GenerateRdl() 'Create the RDLC file
ShowReport() 'Load it into the ReportViewer Control
RaiseEvent ReportLoaded(Me) 'Indicate via event that report is loaded and ready to be displayed
Catch ex As Exception
'Handle error
End Try
End Sub
'returns a list of fields from a datatable used for the report
Public Function GetTableFields(ByVal tableIndex As Integer) As List(Of String)
Dim dataTable As DataTable = _reportDataset.Tables(tableIndex)
Dim availableFields As New List(Of String)
Dim i As Integer
For i = 0 To dataTable.Columns.Count - 1
availableFields.Add(dataTable.Columns(i).ColumnName)
Next i
Return availableFields
End Function
'returns a list of captions from a datatable
Public Function GetTableCaptions(ByVal tableIndex As Integer) As List(Of String)
Dim dataTable As DataTable = _reportDataset.Tables(tableIndex)
Dim captions As New List(Of String)
Dim i As Integer
For i = 0 To dataTable.Columns.Count - 1
captions.Add(dataTable.Columns(i).Caption)
Next i
Return captions
End Function
- Загрузить файл RDLC в reportViewer из памяти
- Добавьте источник данных в элемент управления ReportViewer, используя то же имя, указанное в файле RDLC. Если имена не совпадают, вы получите ошибки.
[код начинается здесь - кодовый блок испорчен и не может это исправить.]
Public Sub DisplayReport(ByVal ms As MemoryStream, ByVal ds As DataSet)
Dim RowCount As Integer = 0
ReportViewer1.Reset()
ReportViewer1.LocalReport.DataSources.Clear()
ReportViewer1.LocalReport.LoadReportDefinition(ms)
For I As Integer = 0 To Me.ReportEngine.ReportDataSet.Tables.Count - 1
'Bind dataTables to the report viewer control - matches the datasources contained in the RDLC files
ReportViewer1.LocalReport.DataSources.Add(New ReportDataSource("MyData" + I.ToString, ds.Tables(I)))
'Calc total rows returned
RowCount += ds.Tables(I).Rows.Count
Next
SetupReport()
ReportViewer1.RefreshReport()
End Sub
В любом случае, если у вас есть дополнительные вопросы, я мог бы продолжать в течение нескольких дней. Для этого нужно многое сделать.