• VS2005下水晶报表如何实现动态数据源绑定?


          之前在论坛中经常有人问起在VS2005中使用水晶报表(Crystal Report 10)如何用DataSet实现动态的数据源绑定?关于这个问题我研究了一下,找到了新的解决方案。
        在以前VS2003中可以采用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.
    如何将CrystalReportSourceSqlDataSource两个控件连接在一起呢?可以这样:选择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>
  • 相关阅读:
    AO学习资料.pdf
    ArcGIS中对Feature的操作
    http://bbs.esrichinabj.cn/ESRI/thread7402911.html
    ArcEngine获取两点间沿曲线的距离已经解决
    http://edndoc.esri.com/arcobjects/9.2/welcome.htm
    shp文件读入内存变量
    韩鹏 地图编辑 笔记
    出差补贴没算
    素数小结
    tomcat7配置
  • 原文地址:https://www.cnblogs.com/newwind521/p/876884.html
Copyright © 2020-2023  润新知