• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    ASP.NET中動態控制RDLC報表

    來源:懂視網 責編:小采 時間:2020-11-27 22:45:54
    文檔

    ASP.NET中動態控制RDLC報表

    ASP.NET中動態控制RDLC報表:在asp.net程序中,可以選擇使用水晶報表,功能確實強大。但是web版的水晶報表好像存在版權的問題。如果所作報表不是復雜的一塌糊涂的話,可以使用微軟自帶的Rdlc報表。 Rdlc優點: 1:Rdlc報表設計簡單 2:結果存成xml,易于控制 3:導出格式作的很不錯
    推薦度:
    導讀ASP.NET中動態控制RDLC報表:在asp.net程序中,可以選擇使用水晶報表,功能確實強大。但是web版的水晶報表好像存在版權的問題。如果所作報表不是復雜的一塌糊涂的話,可以使用微軟自帶的Rdlc報表。 Rdlc優點: 1:Rdlc報表設計簡單 2:結果存成xml,易于控制 3:導出格式作的很不錯

      在asp.net程序中,可以選擇使用水晶報表,功能確實強大。但是web版的水晶報表好像存在版權的問題。如果所作報表不是復雜的一塌糊涂的話,可以使用微軟自帶的Rdlc報表。

      Rdlc優點:

      1:Rdlc報表設計簡單

      2:結果存成xml,易于控制

      3:導出格式作的很不錯

      這里所說的動態控制報表所指的是:在一些時候,制作了報表之后希望在運行中可以動態的做一些小修改,比如說列的位置,用戶控制顯示那些列等等。

      控制方法,嘗試了這么幾種:

      1:控制微軟提供的報表對象的屬性;

      2:報表全部自動生成

      3:修改報表源文件,然后加載。

      控制微軟提供的報表對象的屬性:基于這個功能需求,一開始我想到的方法是通過控制微軟提供的這些報表對象的屬性來實現。因為這種方法最人道了。但是事與愿違,微軟的ReportViewer對象是用來顯示Report的,自然不行;我使用的report是自己設計的,localReport,找到Report對象,里面方法有這個幾個:report.GetDefaultPageSettings();report.GetDocumentMap()等,第一個是獲取打印紙張德設置,第二個是獲取doc文檔(但是始終出錯),都是只讀屬性;所以,第一種嘗試失敗。

      第二種方法就是報表全部自動生成。可以找到一個完整的例子,在這里:http://www.gotreportviewer.com/DynamicTable.zip
    這個例子里面,他把xml結構的rdlc報表寫成一個類ReportDefinition,然后通過自定義這個類的內容來得到一個報表。其實際還是為了自己構造一個報表對象的xml。這是加載自定義報表的過程:win下的代碼 this.reportViewer1.Reset();

    this.reportViewer1.LocalReport.LoadReportDefinition(m_rdl);
    this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("MyData", m_dataSet.Tables[0]));
    this.reportViewer1.RefreshReport();這是自動生成xml的代碼:
    private MemoryStream GenerateRdl(List<string> allFields, List<string> selectedFields)
    {
     MemoryStream ms = new MemoryStream();
     RdlGenerator gen = new RdlGenerator();
     gen.AllFields = allFields;
     gen.SelectedFields = selectedFields;
     gen.WriteXml(ms);
     ms.Position = 0;
     return ms;
    }

      這是完全ReportDefinition的一部分定義:

    namespace Rdl {
     using System.Xml.Serialization;

     /**//// <remarks/>
     [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
     [System.SerializableAttribute()]
     [System.Diagnostics.DebuggerStepThroughAttribute()]
     [System.ComponentModel.DesignerCategoryAttribute("code")]
     [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
     [System.Xml.Serialization.XmlRootAttribute(Namespace=_
      "http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition", IsNullable=false)]
     public partial class Report {
      private object[] itemsField;

      但是幾經考慮之后,這個方案也不讓人滿意,原因是:所有的報表對象都得自己生成,一下子回到了解放前,沒有可視化工具的設計既繁瑣又復雜。特別是如果設計幾個line,然后再來上幾個分組的話,工作量巨大。

      于是乎嘗試第三種方法:ReportVivwer加載報表前在內存中修改報表源文件。這個方法比較狠,其實可以解決很多問題,包括設計自定義的打印紙張等(這里有另外一種設置打印紙張的方法http://waxdoll.cnblogs.com/archive/2006/03/03/342435.html)。

      設計思路是:首先加載rdlc文件到一個XmlDocument對象;然后修改xml內容;把xml序列化成字節流,交給ReportViewer顯示。

      這是這一段代碼:

    public MemoryStream GenerateRdlc()
    {
     XmlDocument sourceDoc = new XmlDocument();
     string path = AppDomain.CurrentDomain.BaseDirectory + "Test/OrderList.rdlc";
     sourceDoc.Load(path);
     Hashtable reportColumns = GetReportColumns(sourceDoc.LastChild);
     //just remove
     for (int i = 0; i < reportColumns.Count; i++)
     {
      if (!FindReportCoulmns(reportColumns[i].ToString()))
      {
       RemoveColumnFromRdlc(sourceDoc.LastChild, i);
      }
     }

     MemoryStream ms = new MemoryStream();
     XmlSerializer serializer = new XmlSerializer(typeof(XmlDocument));
     serializer.Serialize(ms, sourceDoc);
     ms.Position = 0;
     return ms;
    }
      至于如何GetReportColumns和RemoveColumnFromRdlc,那就很簡單了,就是一個操作xml對象的過程。比方說:

    private Hashtable GetReportColumns(XmlNode root)
    {
     Hashtable cols = new Hashtable();
     //XmlNamespaceManager s=new XmlNamespaceManager(
      XmlNode cells = FindChildNode(root,"Body/ReportItems/Table/Header/TableRows/TableRow/TableCells");
     for (int i = 0; i < cells.ChildNodes.Count; i++)
     {
      XmlNode cell =FindChildNode( cells.ChildNodes[i],"ReportItems/Textbox/DataElementName");
      cols[i] = cell.InnerText;
     }
     return cols;
    }
      這是使用這一段的代碼:

    this.ReportViewer1.LocalReport.LoadReportDefinition(this.Report.GenerateRdlc());
    this.ReportViewer1.LocalReport.DataSources.Add(new ReportDataSource("DataSet1", result.Tables[0]));
    this.ReportViewer1.LocalReport.Refresh();
      這個方法終于成功了。

      附:rdlc文件的xml一段結構

      xml結構

    1<?xml version="1.0" encoding="utf-8"?>
    2<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">
    3 <DataSources>
    4 <DataSource Name="ConnectionString">
    5 <ConnectionProperties>
    6 <ConnectString />
    7 <DataProvider>SQL</DataProvider>
    8 </ConnectionProperties>
    9 <rd:DataSourceID>073016a7-6cb0-4e06-a6fd-f5882a039188</rd:DataSourceID>
    10 </DataSource>
    11 </DataSources>
    12 <BottomMargin>2.5cm</BottomMargin>
    13 <RightMargin>2.5cm</RightMargin>
    14 <PageWidth>21cm</PageWidth>
    15 <rd:DrawGrid>true</rd:DrawGrid>
    16 <InteractiveWidth>21cm</InteractiveWidth>
    17 <rd:GridSpacing>0.25cm</rd:GridSpacing>
    18 <rd:SnapToGrid>true</rd:SnapToGrid>
    19 <Body>
    20 <ColumnSpacing>1cm</ColumnSpacing>
    21 <ReportItems>
    22 <Chart Name="chart1">

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    ASP.NET中動態控制RDLC報表

    ASP.NET中動態控制RDLC報表:在asp.net程序中,可以選擇使用水晶報表,功能確實強大。但是web版的水晶報表好像存在版權的問題。如果所作報表不是復雜的一塌糊涂的話,可以使用微軟自帶的Rdlc報表。 Rdlc優點: 1:Rdlc報表設計簡單 2:結果存成xml,易于控制 3:導出格式作的很不錯
    推薦度:
    標簽: 動態 net 報表
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 色欲久久久天天天综合网精品| 国产成人精品久久一区二区三区 | 日本精品一区二区三区四区| 国产精品无码无卡在线播放| 香蕉国产精品麻豆亚洲欧美日韩精品自拍欧美v国 | 国产精品人人做人人爽| 国产精品午夜免费观看网站| 久久亚洲精品成人av无码网站| 国产精品性爱| 欧美国产亚洲精品高清不卡| 精品免费人成视频app| 亚洲一区精品伊人久久伊人 | 911亚洲精品国产自产| 999久久久免费精品国产| 久久精品一本到99热免费| 中文字幕精品亚洲无线码一区应用| 黑人巨茎精品欧美一区二区| 国产精品免费在线播放| 99热这里只有精品国产66| 欧美精品888| 99久久免费国产精品热| 国产精品人成在线播放新网站| 人妻精品久久无码专区精东影业| 亚洲日韩国产AV无码无码精品 | 一区二区精品在线| 国产成人精品免费视频大| 精品不卡一区二区| 久久亚洲精精品中文字幕| 亚洲欧美激情精品一区二区| 亚洲国产精品专区在线观看| 亚洲AV日韩精品一区二区三区| 四虎影视永久在线精品免费| 麻豆精品三级全部视频 | 久久精品国产第一区二区三区| 亚洲精品乱码久久久久久按摩 | 久久精品中文字幕一区| 国产三级精品三级| 国产精品无码久久综合网| 国产精品美女久久久久av爽| 国产在线观看高清精品| 久久精品国产99久久香蕉|