2009-11-12 56 views
0

背景
  • 我正在写将(最终)作为输入一个System.Data.DataTable并使其作为(简单的方法的Winform的,为了做到这一点,我需要(1)根据DataTable动态创建一个RDL文件(2)将RDL加载到ReportViewerControl(3)中,绑定ReportViewerControl到数据表

问题

  • 理想情况下,我只是喜欢链接到一个样本,做了以上所有 - 我已经搜索,但一直无法找到一个。
  • 否则,我需要一些帮助,特别是#1和#3以上。
  • #1 - 是否在运行时动态生成RDL文件的简单方法? (我已经开始编写代码来发出正确的XML,但重新使用的东西将会同我一些时间)
  • 对于#3 - 这是我不清楚如何将ReportViewerControl到DataTable我有本地绑定。我发现的大多数例子都假设我ReportViewer控件将获取远程SQL服务器上的数据(这是预期的),而不是从本地DataTable获取数据。

背景

  • 我最近才开始与ReportViewer控件的工作 - 我发现谷歌搜索的样本 - 但没有人可以覆盖整个场景
  • 我不知道的架构DataTable提前。在调用我的方法时,DataTable的模式甚至不会保持不变。
  • 我不能使用不同的报告控制 - 我必须使用ReportViewer控件。如果您确实知道其他报告控件可以让这项任务变得简单,请让我知道。即使它不能解决我目前的问题,它在以后也会有用。
  • 查看本报告的人是最终用户,并且无权将RDL发布到SSRS服务器
  • DataTable已经被排序,过滤等。这些类型都将仅仅是字符串的值,整数,双打和日期。 DataTable将具有合理的大小 - 1-30列,并具有100到5000行。 DataTable也在本地构建(有时通过代码手动构建),并且从而不是从某个远程数据源检索数据。
  • 数据将始终呈现为一个简单的表格(无图表等)。后来我可能需要添加分组
  • 我不能切换到使用HTML,XAML等,以显示报告 - 有中的ReportViewer的功能,我将最终使用的是该HTML,XAML等不具备的。

UPDATE ON 2010/01/15

乔恩的回答下面开始我能够实现我需要的东西。正如他所提到的,difficut部分正在学习RDL XML模式,并且知道要写入哪些RDL元素来实现所需的报告类型。动态呈现一个DataTable到使用SSRS ReportViewer控件

回答

1

我在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文件中指定。如果名称不匹配,则会出错。

[代码这里开始 - 代码块搞砸了,不能修复]

​​

昏暗的行数为整数= 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 

不管怎么说,如果您有更多问题,我可以继续这几天。要做到这一点,有很多事情要做。

0
public static DataTable GetDataTabletFromCSVFile(string filePath, bool isHeadings) 
    { 
     DataTable MethodResult = null; 
     try 
     { 
      using (TextFieldParser TextFieldParser = new TextFieldParser(filePath)) 
      { 
       if (isHeadings) 
       { 
        MethodResult = GetDataTableFromTextFieldParser(TextFieldParser); 

       } 
       else 
       { 
        MethodResult = GetDataTableFromTextFieldParserNoHeadings(TextFieldParser); 

       } 

      } 

     } 
     catch (Exception ex) 
     { 
      ex.HandleException(); 
     } 
     return MethodResult; 
    } 

    public static DataTable GetDataTableFromCsvString(string csvBody, bool isHeadings) 
    { 
     DataTable MethodResult = null; 
     try 
     { 
      MemoryStream MemoryStream = new MemoryStream(); 


      StreamWriter StreamWriter = new StreamWriter(MemoryStream); 

      StreamWriter.Write(csvBody); 

      StreamWriter.Flush(); 


      MemoryStream.Position = 0; 


      using (TextFieldParser TextFieldParser = new TextFieldParser(MemoryStream)) 
      { 
       if (isHeadings) 
       { 
        MethodResult = GetDataTableFromTextFieldParser(TextFieldParser); 

       } 
       else 
       { 
        MethodResult = GetDataTableFromTextFieldParserNoHeadings(TextFieldParser); 

       } 

      } 

     } 
     catch (Exception ex) 
     { 
      ex.HandleException(); 
     } 
     return MethodResult; 
    } 

    public static DataTable GetDataTableFromRemoteCsv(string url, bool isHeadings) 
    { 
     DataTable MethodResult = null; 
     try 
     { 
      HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
      HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 

      StreamReader StreamReader = new StreamReader(httpWebResponse.GetResponseStream()); 

      using (TextFieldParser TextFieldParser = new TextFieldParser(StreamReader)) 
      { 
       if (isHeadings) 
       { 
        MethodResult = GetDataTableFromTextFieldParser(TextFieldParser); 

       } 
       else 
       { 
        MethodResult = GetDataTableFromTextFieldParserNoHeadings(TextFieldParser); 

       } 

      } 

     } 
     catch (Exception ex) 
     { 
      ex.HandleException(); 
     } 
     return MethodResult; 
    } 


    private static DataTable GetDataTableFromTextFieldParser(TextFieldParser textFieldParser) 
    { 
     DataTable MethodResult = null; 
     try 
     { 
      textFieldParser.SetDelimiters(new string[] { "," }); 

      textFieldParser.HasFieldsEnclosedInQuotes = true; 


      string[] ColumnFields = textFieldParser.ReadFields(); 

      DataTable dt = new DataTable(); 

      foreach (string ColumnField in ColumnFields) 
      { 
       DataColumn DataColumn = new DataColumn(ColumnField); 

       DataColumn.AllowDBNull = true; 

       dt.Columns.Add(DataColumn); 

      } 


      while (!textFieldParser.EndOfData) 
      { 
       string[] Fields = textFieldParser.ReadFields(); 


       for (int i = 0; i < Fields.Length; i++) 
       { 
        if (Fields[i] == "") 
        { 
         Fields[i] = null; 

        } 

       } 

       dt.Rows.Add(Fields); 

      } 

      MethodResult = dt; 

     } 
     catch (Exception ex) 
     { 
      ex.HandleException(); 
     } 
     return MethodResult; 
    } 

    private static DataTable GetDataTableFromTextFieldParserNoHeadings(TextFieldParser textFieldParser) 
    { 
     DataTable MethodResult = null; 
     try 
     { 
      textFieldParser.SetDelimiters(new string[] { "," }); 

      textFieldParser.HasFieldsEnclosedInQuotes = true; 

      bool FirstPass = true; 

      DataTable dt = new DataTable(); 

      while (!textFieldParser.EndOfData) 
      { 
       string[] Fields = textFieldParser.ReadFields(); 

       if(FirstPass) 
       { 
        for (int i = 0; i < Fields.Length; i++) 
        { 
         DataColumn DataColumn = new DataColumn("Column " + i); 

         DataColumn.AllowDBNull = true; 

         dt.Columns.Add(DataColumn); 

        } 

        FirstPass = false; 

       } 

       for (int i = 0; i < Fields.Length; i++) 
       { 
        if (Fields[i] == "") 
        { 
         Fields[i] = null; 

        } 

       } 

       dt.Rows.Add(Fields); 

      } 

      MethodResult = dt; 

     } 
     catch (Exception ex) 
     { 
      ex.HandleException(); 
     } 
     return MethodResult; 
    }