RDLC報表應用之Subreport (傳遞Parameter and ReportDataSource)

報表中的子報表問題 收藏
注:本文引自http://www.cnblogs.com/dlwang2002/archive/2006/12/07/585815.html隨心所欲的BLOG
Subreport 是報表控件中的一個,可以在報表中嵌套另外一個子報表。這裏討論的就是如何使用這個subreport。主要包括:如何填充數據(ReportDataSource),如何向子報表傳遞參數(Parameter)。
    關於subreport的應用,有人已經作了論述(http://www.cnblogs.com/waxdoll/archive/2006/10/13/458409.html)。這個應用裏面已經解釋得比較詳細了,關於如何定義數據源,如何使用SubreportProcessing事件等。我這裏作其他的論述(例子是從我的一個報表模塊裏面摘出的代碼)。從外部傳遞過去的東西也就是主要分爲兩類:數據源和參數。
   1:關於數據傳遞
          reportManager.Viewer.LocalReport.SubreportProcessing += new Microsoft.Reporting.WebForms.SubreportProcessingEventHandler(LocalReport_SubreportProcessing);
       這是事件代理,用於在子報表加載時向子報表提供數據源(僅僅是數據源,而不是參數。這個就是我所遇到的問題)
    這是提供數據源的函數
      void LocalReport_SubreportProcessing(object sender, Microsoft.Reporting.WebForms.SubreportProcessingEventArgs e)
     {
            string sql2 = "Select * from T1 where id>" + id;
            DataSet ds1 = Manager.GetORManager().GetDataSet(sql2);
            e.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource(reportName, ds1.Tables[0]));
        }
    sender就是LocalReport對象,e是事件參數,可以向裏面傳遞數據
    幾個要說明的問題
    首先,主報表和子報表中定義的數據源名稱可以一樣麼?事實上,可以。
    爲什麼會有這個問題呢?我上邊的應用是在一個報表模塊裏面的,主報表和子報表有相同的參數和數據源(都是”Dataset_Table_1”)。所以,如果我向裏傳遞了兩個DataTable,重名,並且ReportDataSource也是重名,那麼報表可以區分這些數據麼?(當然,兩個報表數據源裏面的字段名也幾乎都是一樣)。經過測試,沒有問題。
    也就是說,報表接受的兩個(或者多個)數據源,會被送到不同地方的報表,互不干擾。
    這個功能不錯,特別是對於我的這個報表模塊
   2:關於參數傳遞
      然後,第二個問題,參數可以互不干擾的傳遞進去麼?答案是:不能。
      很遺憾。
      從void LocalReport_SubreportProcessing裏面看,這裏接受到的參數只有兩個,一個是LocalReport,一個是e。在主報表加載的時候,我們可以這樣處理:
           ReportParameter[] param = new ReportParameter[_fieldMapTable.Count];
            //map the column and paran
            foreach (DictionaryEntry de in _fieldMapTable)
            {
                string mapTarget = de.Key.ToString();//standard name
                string mapFrom = de.Value.ToString();//ur name
                 param[i++] = new ReportParameter("Report_Parameter_" + mapTarget, mapFrom);//push param in
            }
            try
            {
                //set param
                reportView.LocalReport.SetParameters(param);
                //set data source
                reportView.LocalReport.DataSources.Add(new ReportDataSource(this._dataSetName, dataTable));//set DataSetName here
                //refresh, to show
                reportView.LocalReport.Refresh();
            }……
     可以看到,我們在這裏向報表傳遞了參數param。這是一個參數數組。同樣的方法,我們能在LocalReport_SubreportProcessing裏面應用麼?不能,因爲這個時候,(sender as LocalReport)已經成了一個只讀的狀態((sender as LocalReport).SetParameters(param);),無法傳遞任何參數。然後e呢?可惜的很,e.Parameters也是隻讀的。
     在程序裏面,我找不到方法向子報表傳遞參數。
     其他地方倒還是有些辦法的,就在主報表中的subreport控件的屬性裏面設置參數,通過主報表傳遞過去。
     這個使用方法,“蠟人張”的文章裏面也有:在subreport上右鍵 / 屬性 /參數 /設置子報表的參數 = 主報表的參數(或者字段)名稱。需要注意的是:子報表中的參數名稱不能和主報表中的參數重名。這個正好和數據源相反。
     在我的應用裏面,沒個報表都有相同的參數設置,這下子,就有點麻煩了,需要調整一些實現。
 
後記:
報表的頭(page header)和尾(page footer)中是不能綁定Filed的,只能綁定Parameter。如果Parameter不能方便的傳遞,應用中就有小麻煩了。
事實這種情況倒是還不會出現,因爲子報表基本不會再出現page header了。


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/yyed/archive/2008/06/13/2542495.aspx

發佈了33 篇原創文章 · 獲贊 15 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章