星期三, 3月 26, 2008

動態改變RDLC報表DataSource

先用設定好的DataSet(這裏叫Report.xsd)設定RDLC檔,以Report.rdlc為例。
接者在Asp.Net報表裏拉入Report Viewer,指向Report.rdlc,刪掉datasource那些用不到的東西,在aspx裏會看到類似
<rsweb:reportviewer id="ReportViewer1" runat="server" font-names="Verdana" font-size="8pt" height="400px" width="800px">
<LocalReport ReportPath="Report.rdlc">
</LocalReport>
</rsweb:reportviewer>

RDLC檔其實是一個xml,和Crystal Reports的rpt二進位格式大不同。用文字編輯器打開來看,會看到類似:<DataSet Name="Report_ReportList"> 或是<DataSet Name>Report_ReportList</DataSet Name> 這裏Report是我在.xsd檔裏定義的DataSet名稱,而ReportList是table名稱,知道這個DataSet Name後,就可以動態改變RDLC的DataSource。

用我寫的程式片斷舉例:
private void RefreshReport()
{
ReportViewer1.LocalReport.DataSources.Clear();
DataTable dt = getReportDataTable(); //這是我寫的private method
ReportViewer1.LocalReport.DataSources.Add(
new Microsoft.Reporting.WebForms.ReportDataSource("Report_ReportList", dt));
}
很簡單吧!只要加入一個ReportDataSource,參數裏設定DataSet為相同名稱,再把DataTable傳入即可。要重新改變報表內容時,必須先執行
ReportViewer1.LocalReport.DataSources.Clear(); 
否則每次都只看到第一次傳入的內容。

3 則留言:

匿名 提到...

你好! 很喜歡看你的blog 有不同有關電腦的專題, 很棒! 努力啞!

看完 datasource後, 有一問題請教, 在vs 2005, 使用reportview open CrystalReport每佔用了記憶體, 但沒有釋放, 即使用了clear(), dispose(), gc.collect(). 都未能釋放記憶體.
請問有這經驗嗎?

鳥毅 提到...

抱歉了,小弟只是兩光網管,programming only for fun!

這個問題在下確實不知道,因為我只有玩一玩而已:P

建議這位老大可以找原廠support,這幾年台灣的總代理是精誠公司;或是詢問uuu的鄭淑芬小姐。

幫您問了一下股溝,可能和 http://social.msdn.microsoft.com/forums/en-US/vsreportcontrols/thread/d21f8b56-3123-4aff-bf84-9cce727bc2ce 類似吧?希望對你有幫助。

匿名 提到...

謝謝!