asp.net中動態使用水晶報表


  採用PUSH模式推報表,可以用如下的代碼實現:       
    con = new SqlConnection(Session["SQLCONNECTION"].ToString());
strSql 
= "SELECT * FROM htOrder";
scm 
= new SqlCommand(strSql, con);
sda 
= new SqlDataAdapter(scm);
ds 
= new DataSet();
sda.Fill(ds, 
" order ");
rptOrder.SetDataSource(ds.Tables[
"order"]);
crOrder.ReportSource 
= rptOrder; 

         

        VS2005中不再支持“embedded report”嵌入式報表,只能採用非嵌入式報表的方法拉數據,下面是典型的代碼:

    //綁定報表數據
            private void BindCrystalReports()
        
{
                
string path1 = Server.MapPath("~//Report//");
                
string path2 = path1 + "repOrder.rpt";
                ReportDocument repDoc 
= new ReportDocument();
                repDoc.Load(path2);
                SetDBLogonForReport(repDoc);          
//設置數據登錄信息
                crOrder.ReportSource = repDoc; 
                
string selectionFormula = "{htOrder.htID} =" + txtHtID.Text.Trim();//設置報表數據篩選公式
                repDoc.DataDefinition.RecordSelectionFormula = selectFormula;
                crOrder. DataBind ();     
        }

        
//設置登錄信息
        private void SetDBLogonForReport(ReportDocument reportDocument)
    
{
        
try
        
{
                ConnectionInfo connectionInfo 
= new ConnectionInfo();
                connectionInfo.ServerName 
= ConfigurationManager.AppSettings["ServerName"];
                connectionInfo.DatabaseName 
= ConfigurationManager.AppSettings["DatabaseName                connectionInfo.UserID = ConfigurationManager.AppSettings["UserID"];
                connectionInfo.Password 
= ConfigurationManager.AppSettings["Password"];
                Tables tables 
= reportDocument.Database.Tables;
                
foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables)
           
{
                    TableLogOnInfo tableLogonInfo 
= table.LogOnInfo;
                    tableLogonInfo.ConnectionInfo 
= connectionInfo;
                    table.ApplyLogOnInfo(tableLogonInfo);
                }

        }

           
catch
      
{                lblNote.Text = "<script>alert('數據庫登錄信息不正確!');</script>";
           }

}

    

                  

        這種方式是不是太頻繁瑣了,在數據結構更改或者查詢條件發生變化時必須要再次更改報表設置,那麼在VS2005中水晶報表有沒有更簡潔的方法呢?最好不用寫代碼就能搞定呢?有,那就是新的數據綁定控件CrystalReportSource,這個控件與SqlDataSource數據源綁定控件一起連用就可以用SQL表達式作數據源推數據了。下面是實現的步驟:

        1. 建立水晶報表,注意報表要用OLE DB ADO方式連接數據源,這樣可以省去報表登錄窗口的彈出。
        2. 在設計視圖中拖拉報表控件CrystalReportViewer,點擊右上角智能標籤設置報表數據源,選擇報表文件,自動生成CrystalReportSource,這時在設計視圖中將顯示出報表界面,水晶報表將自動用初始數據填充報表字段。注意這裏有個小Bug,如果報表在子目錄中,選擇報表文件將自動用相對路徑表示,這時報表顯示會出錯,應改成絕對路徑纔可以。
            <Report FileName="report/rptOrder.rpt">這裏應改成:<Report FileName="../report/rptOrder.rpt">
        3.拖拉一個數據源控件SqlDataSource(也可以用ObjectDataSource),按嚮導生成數據源,這裏可以篩選數據,根據情況選擇各類數據源。            
        4.如何將CrystalReportSource與SqlDataSource兩個控件連接在一起呢?可以這樣:選擇CrystalReportSource控件點擊右側屬性中數據欄,再點擊Report選擇DataSource,在這個數據源集合編輯器選擇數據源指定報表名稱即可。(下面的Parameters是用來選擇報表參數用的)

        經過這幾個步驟,就可以運行程序顯示報表啦,怎麼樣不用寫一句代碼吧?

具體代碼可參考如下:<CR:CrystalReportViewer ID="crOrder" runat="server" AutoDataBind="True"  ReportSourceID="ReportSourceOrder"  BestFitPage="False" DisplayToolbar="False" DisplayGroupTree="False" Height="1042px" Width="775px" EnableParameterPrompt="False" />        
        
<CR:CrystalReportSource ID="ReportSourceOrder" runat="server">
            
<Report FileName="../report/rptOrder.rpt">                           
                    
<DataSources>
                          
<CR:DataSourceRef DataSourceID="SqlDataSourceOrder" TableName="htOrder" />
           
</DataSources>
  
</Report>
</CR:CrystalReportSource>
<asp:SqlDataSource ID="SqlDataSourceOrder" runat="server" ConnectionString="<%$ ConnectionStrings:cc_2005 %>"
SelectCommand
="SELECT * FROM [htOrder] "></asp:SqlDataSource> 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章