VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > Objective-C编程 >
  • Visual Studio 2008 水晶报表快速入门


  
先新建一个Web项目: CrystalWebApp

为项目添加新项: CrystalReport1.rpt

在弹出的对话框,选择作为空白报表。用向导当然更方便,但在这里,白手起家或许能更好地理解。

在工具箱选择 Text Object,拖到报表头。写些字,设置字体之类的。在属性选项卡设置它的名字为 txtTitle 以供将来程序访问。
 

水晶报表对于程序员来说其实跟 Repeater 控件是很相似的。于是需要数据和字段名。在Repeater 控件中你可以很随意地指定要绑定的字段名。在程序还没有真正运行之前,这个字段名可以没有任何表的字段名跟它匹配,也可以没有任何类的属性名跟它匹配。但在水晶报表中,字段名在设计阶段就必须是真实存在的。还能稍感安慰的是,水晶报表一旦设计好之后,就能像 Repeater 控件那样绑定任意类型的对像。而不必是设计时指定字段来源的表或类。所以我们现在要创造些真实存在的字段名……

        create table TabTest
        (
	        UserID int,
	        UserName nvarchar(50),
	        Age int,
	        Birthday datetime
        )
    

你可以用 Access 或者 Excel 来创造真实存在的字段名,但我这里是使用 SQL Server。

在 "字段资源管理器" 的 "数据库字段" 上按右键,选择 "数据库专家..."。在弹出的对话框中,创建新连接==>OLE DB (ADO)(Access 或者 Excel 应点 "数据库文件" 前的 "+" 号)。 在弹出的对话框,选择 "SQL Native Client" 作为提供程序。

按提示一步步地做,直到连上数据库。选择表 TabTest,把它弄到右边的框中。再点击确定。

折腾了半天就是为了这些字段名。对水晶报表的开发商无语……

把需要显示的字段拖到 "详细资料"。"页眉" 和 Word 文档中的页眉完全不是一回事。这里的页眉其实就是列名(表头)。那么就顺便改一下列名吧。默认是有下划线的,可以改一下格式。

"页脚" 倒是跟 Word 文档中的页脚概念相同,可以拖个特殊字段页码进去。

点击工具箱中的 Line Object 可以为报表画线。你会发现,画一个表格竟然是如此地困难。

在报表空白处按右键,设计==>打印机设置 也许有你想要的东西。

那么专业的事情应该交给那么专业的人士去做,我们的任务是写代码……

进入 Default.aspx 的设计视图,从工具箱中拖个 CrystalReportViewer 过来。

接下来需要数据。数据当然可以是来自设计时的表。但我这里是来自于新建的类: UserInfo。在项目中添加一个 UserInfo 类。

        using System;

        namespace CrystalWebApp
        {
            public class UserInfo
            {
                private int userID;

                public int UserID
                {
                    get { return userID; }
                    set { userID = value; }
                }
                private string userName;

                public string UserName
                {
                    get { return userName; }
                    set { userName = value; }
                }
                private int age;

                public int Age
                {
                    get { return age; }
                    set { age = value; }
                }
                private DateTime birthday;

                public DateTime Birthday
                {
                    get { return birthday; }
                    set { birthday = value; }
                }
            }
        }    
    

为 Default.aspx 写些后台代码

        using System;
        using System.Collections.Generic;

        using CrystalDecisions.CrystalReports.Engine;
        using CrystalDecisions.Shared;

        namespace CrystalWebApp
        {
            public partial class _Default : System.Web.UI.Page
            {

                protected void ForCrystalReport()
                {
                    ReportDocument doc = new ReportDocument();
                    doc.Load(Server.MapPath("CrystalReport1.rpt"));
                    //doc = new CrystalReport1();
                    
                    TextObject txtTitle = (TextObject)doc.ReportDefinition.ReportObjects["txtTitle"];
                    txtTitle.Text += "相当不错";
                    
                    List<UserInfo> list = GetData();
                    doc.SetDataSource(list);
                    this.CrystalReportViewer1.ReportSource = doc;
                }

                protected List<UserInfo> GetData()
                {
                    List<UserInfo> list = new List<UserInfo>();
                    for (int i = 0; i < 80; i++)
                    {
                        UserInfo user = new UserInfo();
                        user.Age = 10+i;
                        user.Birthday = DateTime.Now.AddDays(i);
                        user.UserID = 100+i;
                        user.UserName = string.Format("水果{0}号", i);
                        list.Add(user);
                    }
                    return list;
                }

                protected void Page_Load(object sender, EventArgs e)
                {

                }
                
                protected void CrystalReportViewer1_Init(object sender, EventArgs e)
                {
                    ForCrystalReport();
                }
            }
        }
    

ForCrystalReport 方法是需要重点关注的。要想显示报表首先要把报表变成对象的形式。ReportDocument doc 就是这样的对象。doc.Load(Server.MapPath("CrystalReport1.rpt")); 是个很不错的方法。它能加载已经设计好的报表,即使这个报表不是VS2008制作的 (也就是没有*.cs文件的报表)。如果是VS2008制作的报表可以直接 new 出来:doc = new CrystalReport1();。然后为 doc 设置数据源:doc.SetDataSource(list);。最后让页面的水晶报表显示控件把它显示出来:this.CrystalReportViewer1.ReportSource = doc;。

需要注意的是 ForCrystalReport(); 方法是在 CrystalReportViewer1 的 Init 事件中调用的。而不是习惯性地在 Page_Load 或按钮单击事件中。这样做是为了防止水晶报表翻页时最多只能翻到第 2 页。


往为了创造真实存在的字段名的表中插入些数据:

        declare @i int
        set @i=0
        begin transaction 
        while @i<80
        begin
	        set @i=@i+1
	        insert into TabTest values (100+@i, 'Name'+convert(nvarchar(50),@i), @i, dateadd(dd,@i,getdate()) )
        end
        commit
        go

        select * from tabtest
        go
    

创建个 Default2.aspx 页,内容和 Default.aspx 页一样。把 ForCrystalReport 方法中的:

            List<UserInfo> list = GetData();
            doc.SetDataSource(list);
    

这两行删除掉。在浏览器中查看一下效果。

将会看到类似这样的效果。输入密码后就能看得到数据了。现在我们明白,如果不给报表设置数据源,它就会从设计时指定的数据源中获取数据。但这样需要登录的方式,一般人是不愿看到的。可以让它自动登录。在删掉两行代码的地方插入下面的代码:

            TableLogOnInfo info = new TableLogOnInfo();
            info.ConnectionInfo.DatabaseName = "dbtest";
            info.ConnectionInfo.Password = "sa";
            info.ConnectionInfo.ServerName = @"localhost\sqlexpress";
            info.ConnectionInfo.UserID = "sa";
            foreach (CrystalDecisions.CrystalReports.Engine.Table table in doc.Database.Tables)
            {
                table.ApplyLogOnInfo(info);
            }
    

这样水晶报表就能根据程序提供的信息自动登录,然后再自动获取数据了。


相关教程