2009-11-12 63 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; 
    }