C#中使用RDLC報表


轉自:http://iamgyg.blog.163.com/blog/static/38223257201161432310157/

用RDLC報表(一)

 

1  建立數據源

啟動VS2005新建一個窗體項目,命名為TestProj

 

在左邊的窗體內選擇“添加新數據源”或在菜單上操作“添加新數據源”:

 

選擇后出現對話窗體,選擇“數據庫”,進入“下一步”:

 

本數據源以SqlServer2000所提供的Northwind數據庫為例,因此在數據庫內選擇驅動程序為SqlServer,具體操作視所用數據庫而定(如果連接為Oracle,建議用Oracle所提供的ODP for .NET,地址:http://www.oracle.com/technology/global/cn/software/tech/windows/odpnet/index.html)。

 

 

選擇數據源后,指定數據庫文件,並進行測試,如果連接不通,請檢查你的軟件設置。

 

進行下一步,至顯示出庫文件內的表及視圖,然后打開表,並選擇其中的Employees,選擇完成。

 

在數據源窗口中顯示出所選擇表及表內的字段,以備使用。

 

同時在資源管理器中,也可以看到新增加的數據文件。

 

2  報表瀏覽器

在新建的窗體內,放入報表瀏覽控件:

 

此報表瀏覽控件集成了報表查看及打印預覽的功能,可直接輸出至打印機,也可直接輸出至Excel文件或PDF文件,對於喜歡看Excel表格的客戶來說,這個報表控件非常不錯。關於此報表的來源及台前幕后的各種說法,請自己查詢相關的網站。

3  建立報表文件

選中報表瀏覽器控件后,在控件的右上角會出現一個小三角,點擊后,出現一個菜單,選擇“設計新報表”或在解決方案資源管理器中添加一個新的報表文件:

 

雙擊“報表項”內的“表”,則設計空白表內生成一個表格,我們可以在表格內添加數據項。

 

此報表的設計方式類似於MS以前的VB下報表設計環境。在報表設計器中,我將一份報表分為五個部分,從上至下為:報表標題區、列標題區、數據顯示區、合計及頁腳。如果將報表的設計形式顯示出頁眉及頁腳,報表的形式會看得更清楚些:

選擇頁眉及頁腳:

 

顯示結果:

 

現在開始設計報表:

在“頁眉”區內放入一個文本框,將內容更改為“測試報表”,居中,字體放大加粗:

 

從數據源窗口中選擇合適的列,用鼠標拖到報表內的“詳細信息”表格上,數據會自動填入:

 

 

將設計的報表保存后,返回報表瀏覽窗口,並為報表瀏覽器選擇我們設計的報表:

 

選中報表文件后,菜單也有所改變:

 

再為此報表文件指定數據源,選擇數據源:

 

確定,保存文件並運行測試文件。

4   預覽

報表生成后預覽如下:

 

 

是不是很簡單?我們也可以對這個簡單的報表進行美化,當然,我加上美化的一些功能后,可能效果更差,但此處只是為了演示用法。

?         為數據加表格。

在報表設計器中,選擇需要加表格框的區域

 

然后在工具欄中選擇邊框工具

 

加什么樣的框線根據需要,此處我選擇“所有框線”。

 

看上去比原來的灰線能稍黑一些,在預覽時就能看出來了。

?         加打印時間顯示

加入一個顯示打印時間的文本框,在上面按右鍵,選屬性:

 

在“文件框屬性”內,選擇“值”后面的表達式生成:

 

在表達式中選擇時間:

 

不要忘記表達式的前面一定要有一個“=”,如果沒有,手工加上一個。為了更符合我們的習慣,前面可以加個說明,如打印時間等,表達式的寫法就要稍做改變:還是以“=”開頭,后面加上“打印時間:”,再以“&”連接生成的Now函數即可得到我們想要的樣子。

 

?         為行加序號

為了演示,我將序號列加在了表格了最后列

加入一個新的列:

 

在顯示序號的列中輸入相關的值:

 

 

在此表達式的后面是Nothing,不是null,不要搞錯。

 

三項功能已經完成,預覽:

 

比原來漂亮嗎?至少實用了一些。

使用RDLC報表(二)--使用自定義數據集

1 新建窗體

 

2 建立數據源

 

3 建立報表

 

新的數據報表已經生成,下面開始對數據源進行設置。

4 對報表自動生成的數據源進行設置

選擇工具欄 à 報表 à 數據源,選中所要修改的數據源后,用“重命名”對其進行修改,如myds。

 

 

修改完成后,確定退出此窗口。

 

選中報表設計器內的表格,顯示屬性。將表格的數據集名稱更改為上面修改的名稱。

 

如果一個報表文件內只有一個數據源,則表格內的數據值可直接寫為“=Fields!字段.Value”的格式,如果包含多個數據源,則要對此字段的取值進行指定,如“=(Fields!字段.value,“數據集名稱””。

5 手動生成數據源

手動生成的數據集內必須包含報表文件內設計的字段名稱,否則會運行出現錯誤。

生成數據集:

 

             //  報表執行操作
        
private   void  button1_Click( object  sender, EventArgs e)
        {
            
// 取得數據集
             string  connstring  =   " Data Source=.;Initial Catalog=Northwind;Integrated Security=True " ;
            System.Data.SqlClient.SqlConnection conn1 
=   new  System.Data.SqlClient.SqlConnection(connstring);
            System.Data.SqlClient.SqlCommand command1 
=   new  System.Data.SqlClient.SqlCommand( " select * from customers " , conn1);
            System.Data.SqlClient.SqlDataAdapter ada1 
=   new  System.Data.SqlClient.SqlDataAdapter(command1);
            DataSet c_ds 
=   new  DataSet();
            
try
            {
                conn1.Open();
                ada1.Fill(c_ds);
            }
            
finally
            {
                conn1.Close();
                command1.Dispose();
                conn1.Dispose();
            }
             
// 為報表瀏覽器指定報表文件
            
this .reportViewer1.LocalReport.ReportEmbeddedResource  =   " report.Report1.rdlc " ;
            
// 指定數據集,數據集名稱后為表,不是DataSet類型的數據集
            
this .reportViewer1.LocalReport.DataSources.Clear();
            
this .reportViewer1.LocalReport.DataSources.Add( new  Microsoft.Reporting.WinForms.ReportDataSource( " myds " , c_ds.Tables[ 0 ]));
            
// 顯示報表
            
this .reportViewer1.RefreshReport();
        }

 運行后的數據顯示:

 


使用RDLC報表(三)--向RDLC報表傳入參數

在使用報表向客戶展示結果數據時,實時的在報表中顯示某些特定的數據是必需的,如:顯示的部門、打印的日期等。本文只簡單的演示向報表內傳入一個字符值。如有其它問題,歡迎討論。

1、新建一個工程TestReport,一個Form窗體,放入一個TextBox、一個Button按鈕,再放入一個ReportViewer控件。
2、在ReportViewer上選擇新建一個報表
3、在打開的報表設計器中,選擇工具欄的“報表”中的“報表參數”,新加一個參數,名稱為content,數據類型為string,確定。
4、 在報表設計器的頁面上放入一個文本框,在文本框上按鼠標右鍵->屬性,在“文本框屬性”窗口中,選擇“常規”選項卡內下部的“值”后面的“編輯表達 式”按鈕(就是那個Fx),在此窗口內,左下框內選擇參數,在右下框將會出現在上一步中設置的參數,雙擊此參數,在上面的框內將出現所需要的表達 式:=Parameters!content.Value。保存此報表。報表默認名稱為Report1.rdlc。
5、在Form窗體內雙擊按鈕,編寫如下代碼:

             this .reportViewer1.LocalReport.ReportEmbeddedResource  =   " TestReport.Report1.rdlc " ;
            ReportParameter rp 
=   new  ReportParameter( " content " this .textBox1.Text);
            
this .reportViewer1.LocalReport.SetParameters( new  ReportParameter[]  { rp } );
            
this .reportViewer1.RefreshReport();

6、運行工程,在文本輸入框內輸入數據,按下按鈕,數據是不是已經傳入報表了?

 

//報表參數
ReportParameter[] RP = new ReportParameter[8];
//報表參數名稱
string[] RptParmsName = new string[8] { "p_BillNo", "p_compForshort", "p_LuptDate", "p_compFullname", "p_RecoverSigner", "p_deptname", "p_Issuer", "p_DeliveryDate" };
//報表參數值
object[] RptParmsValue = new object[8] { dt.Rows[0]["BillNo"].ToString(), dt.Rows[0]["compForshort"].ToString(), dt.Rows[0]["LuptDate"], dt.Rows[0]["compFullname"].ToString(), dt.Rows[0]["RecoverSigner"].ToString(), dt.Rows[0]["deptname"].ToString().Trim(), UserName, dt.Rows[0]["DeliveryDate"] };
//為報表傳遞參數
for (int i = 0; i < RP.Length; i++)
{
  RP[i] = new ReportParameter(RptParmsName[i], RptParmsValue[i].ToString());
  this.reportViewer1.LocalReport.SetParameters(new ReportParameter[] { RP[i] });
}

 

使用RDLC報表(四)--鑽取式報表

本文內以MSServer自帶Northwind庫文件內的Customers及Orders這兩個表為例,建立兩個報表文件,在查詢得出 Customers的表數據后,點擊此表內的CustomerID數據,報表將轉入至下一個報表,並顯示與之相關的Orders的數據,即VS中所謂的鑽 取式報表。

1、打開一個工程,並新建一個From,放入一個Button及一個ReportViewer控件。
2、在工程內新建一個數據源,連接到Northwind庫文件,顯示Customers及Orders這兩個表
3、新建一個報表文件,並以表格的形式來顯示數據,將Customers表內的CustomerID、CompanyName及Address三個字段放入,形成一份有表頭及數據的簡單報表,並將此報表保存命名為customerReport
4、再建一個報表文件,與customerReport相同,也以表格的形式來顯示報表,將Orders內的OrderID、CustomerID、ShipName及OrderDate四個字段放入表格內,報表保存為orderReport
5、orderReport的數據源根據主報表customerReport的數據來確定數據源的數據,查看表格的數據集名稱,我的顯示為NorthwindDataSet_Orders,也可以自己另建一個,具體方法見我的《RDLC報表(二)》
6、 再打開customerReport報表,將CustomerID設置成為可點擊的索引字段,以便轉入下一個報表。選擇CustomerID字段,按鼠標 右鍵,在”文本框屬性“窗口中,選擇”導航“選項卡,在下面的”超鏈接“中選擇”跳至報表“,在報表名稱中選擇”orderReport“,再按下后面 的”參數...“按鈕,輸入一個參數名稱,如customerid,參數值選擇=Fields!CustomerID.Value。為了與其它數據相區 分,可以將此列數據根據自己的習慣改變顏色或加下划線
7、在orderReport中,設置一個報表參數,與CurtomerReprot中的名稱相同,以接收父表中傳入的參數
8、 新建兩個取得數據的方法,一個從Customers中取得數據集,另一個從Orders中取得數據集,且帶參數。此兩個方法可以自己編寫類庫來實現,也可 以在VS的數據集內添加。為了演示方便,我直接使用了Customers的GetData(),並編寫了一個Orders的 GetDataByCustomerID(@cid)的方法。
9、在From的Button中編寫如下代碼:
         private   void  button2_Click( object  sender, EventArgs e)
        
{
            NorthwindDataSet.CustomersDataTable dt1 
= new NorthwindDataSetTableAdapters.CustomersTableAdapter().GetData();
            
this.reportViewer1.LocalReport.ReportEmbeddedResource = "TestReport.customerReport.rdlc";
            
this.reportViewer1.LocalReport.DataSources.Clear();
            
this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("NorthwindDataSet_Customers", dt1));
            
this.reportViewer1.RefreshReport();
        }


10、使用報表的Drillthrough事件,當選擇了鑽取項時會發生此事件,給下一個報表取值,代碼如下:
         private   void  reportViewer1_Drillthrough( object  sender, DrillthroughEventArgs e)
        
{
            LocalReport lp 
= (LocalReport)e.Report;
            
string customerid = lp.GetParameters()["customerid"].Values[0].Trim();

            lp.DataSources.Clear();
            lp.DataSources.Add(
new ReportDataSource("NorthwindDataSet_Orders",
                
new NorthwindDataSetTableAdapters.OrdersTableAdapter().GetDataByCustomerID(customerid)));
        }

運到結果:
運行第一份報表:


鑽取后運行第二份報表:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM