zoukankan      html  css  js  c++  java
  • VisualStudio2008+水晶报表的使用

    1:打开VisualStudio2008,新建一个Windows窗体应用程序项目,名称可以自定义,选择项目的保存路径,然后确定

    刚新建好的窗体应用程序:

    2. 把准备好的水晶报表插件复制到项目中的bin文件夹(不复制也可以,个人习惯),然后在程序中引用这些控件

     

    (注意,添加的控件不是每个都用得上,但我这里全部引用了)

     3.在程序中的工具栏中的报表栏添加选择项

    以上就是添加水晶报表的插件到VS2008中,下面就开始使用水晶报表

    4.在Form1窗口放一个按钮,命名为”生成报表”,主要是用来点击后,就弹出一个报表的窗口。那么再需新建一个报表的窗口Form2.

    5. 打开Form2窗口,把这个拖进窗口里。

     

    拖进后,窗口是这样的:

    6. 创建水晶报表,在窗口中鼠标右键弹出选项框,选择创建新Crystal报表

    我这里只是演示,就不重新命名报表名称了,大家可以根据项目来命名

    下面我参考一张报告来设计这个报表,但这个报表有点复杂,我就做简化一点,取其中部分内容显示到报表中,主要是以实现功能为目的。

    7.在报表头输入文字

    8. 插入线条,把Line 工具拖进入,按需要调整

    现在预览看看

    以上就是简单的显示报表的功能,那么一般情况下,都是需要连接数据库,从数据库查询的数据展示到报表中的。那么下面这样的功能

    9. 在数据库中新建一个数据库Test,新建一个Test表,根据需要建立字段,我这里简单建几个字段。

    数据库的Test表的字段如下:

    在VS2008中需要添加一个叫APP.Config的“应用程序配置文件”,如果是高版本的,默认是添加好的

    App.config的代码如下

    添加一个类SqlHelper的类,用于做连接数据库做增删改查的工具

    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Data;
    using System.Data.SqlClient;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 水晶报表
    {
        class SqlHelper
        {
            //获取连接字符串
            private static readonly string connstr = ConfigurationManager.ConnectionStrings["connectstr"].ConnectionString;
            /// <summary>
            /// 创建数据库连接
            /// </summary>
            /// <returns>返回一个连接对象conn</returns>
            public static SqlConnection CreateConnection()
            {
                SqlConnection conn = new SqlConnection(connstr);
                conn.Open();
                return conn;
            }
            /// <summary>
            /// 该方法主要用于增删改操作
            /// </summary>
            /// <param name="conn">连接对象</param>
            /// <param name="sql">sql语句</param>
            /// <param name="parameters">sql语句中的参数</param>
            /// <returns>受影响的行数</returns>
            public static int ExecuteNonQuery(SqlConnection conn, string sql, params SqlParameter[] parameters)
            {
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = sql;
                    cmd.Parameters.AddRange(parameters);
                    return cmd.ExecuteNonQuery();
                }
            }
            /// <summary>
            /// 该方法主要用于增删改操作
            /// </summary>
            /// <param name="sql">sql</param>
            /// <param name="parameters">语句中的参数</param>
            /// <returns>受影响的行数</returns>
            public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters)
            {
                using (SqlConnection conn = CreateConnection())
                {
                    return ExecuteNonQuery(conn, sql, parameters);
                }
            }
            /// <summary>
            /// 首行首列查询
            /// </summary>
            /// <param name="conn">连接对象</param>
            /// <param name="sql">sql语句</param>
            /// <param name="parameters">sql语句中的参数</param>
            /// <returns>返回的是首行首列--object类型</returns>
            public static object ExecuteScalar(SqlConnection conn, string sql, params SqlParameter[] parameters)
            {
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = sql;
                    cmd.Parameters.AddRange(parameters);
                    return cmd.ExecuteScalar();
                }
            }
            /// <summary>
            ///  首行首列查询
            /// </summary>
            /// <param name="sql">sql语句</param>
            /// <param name="parameters">sql语句中的参数</param>
            /// <returns>返回的是首行首列--object类型</returns>
            public static object ExecuteScalar(string sql, params SqlParameter[] parameters)
            {
                using (SqlConnection conn = CreateConnection())
                {
                    return ExecuteScalar(conn, sql, parameters);
                }
            }
    
            /// <summary>
            /// 该方法用来查询
            /// </summary>
            /// <param name="conn">连接对象</param>
            /// <param name="sql">sql语句</param>
            /// <param name="parameters">sql语句中的参数</param>
            /// <returns>返回的是DataTable</returns>
            public static DataTable ExecuteQuery(SqlConnection conn, string sql, params SqlParameter[] parameters)
            {
                DataTable table = new DataTable();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = sql;
                    cmd.Parameters.AddRange(parameters);
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        table.Load(reader);
                    }
                }
                return table;
            }
    
            /// <summary>
            /// 该方法用来查询
            /// </summary>
            /// <param name="sql">sql语句</param>
            /// <param name="parameters">sql语句中的参数</param>
            /// <returns>返回的是DataTable</returns>
            public static DataTable ExecuteQuery(string sql, params SqlParameter[] parameters)
            {
                using (SqlConnection conn = CreateConnection())
                {
                    return ExecuteQuery(conn, sql, parameters);
                }
            }
        }
    }
    SqlHelper代码

    程序还需要添加一个Configuration插件的的引用

    10. 下面我做的功能是:在Form1中,点击按钮,就执行查询数据库Test表的所有数据,然后把数据传递给Form2,由Form2的报表显示出来

       现在先创建一个实体text类,代码如下,然后将实体类绑定到报表里,如下图所示

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace 水晶报表
    {
        class Test
        {
            //TestId, T_Circult_Des, T_Device_Type, T_Device_Rating, T_Conductor_Live, T_Conductor_cpc, T_Pro_conductor, T_Polarity
            private int id;
    
            public int Id
            {
                get { return id; }
                set { id = value; }
            }
    
            private string circult_Des;
    
            public string Circult_Des
            {
                get { return circult_Des; }
                set { circult_Des = value; }
            }
            private string device_Type;
    
            public string Device_Type
            {
                get { return device_Type; }
                set { device_Type = value; }
            }
            private string device_Rating;
    
            public string Device_Rating
            {
                get { return device_Rating; }
                set { device_Rating = value; }
            }
            private string conductor_Live;
    
            public string Conductor_Live
            {
                get { return conductor_Live; }
                set { conductor_Live = value; }
            }
            private string conductor_cpc;
    
            public string Conductor_cpc
            {
                get { return conductor_cpc; }
                set { conductor_cpc = value; }
            }
            private bool pro_conductor;
    
            public bool Pro_conductor
            {
                get { return pro_conductor; }
                set { pro_conductor = value; }
            }
            private bool polarity;
    
            public bool Polarity
            {
                get { return polarity; }
                set { polarity = value; }
            }
        }
    }
    Test类代码

     

    11.在Form1的按钮事件中,增加如下代码

    在Form2的窗口代码中,敲入以下代码

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using CrystalDecisions.CrystalReports.Engine;
    
    namespace 水晶报表
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                
            }
    
            DataTable dt1 = new DataTable();//创建一个dt1对象,存储FORM1传来的数据
            public Form2(DataTable dt)//新建一个有参数的构造函数 
            {
                dt1 = dt;
                InitializeComponent();
            }
         
            
    
            private void Form2_Load(object sender, EventArgs e)//初始化加载
            {
                List<Test> list = DataTableToList(dt1);//创建一个Test对象的集合,把dt1的数据转换成对象存储到集合中
                ReportDocument myReport = new ReportDocument();//创建一个报表对象
                string reportPath = @"D:c#水晶报表水晶报表CrystalReport1.rpt";//定义报表的路径
                // string reportPath = Application.StartupPath + "\CrystalReport1.rpt";
                myReport.Load(reportPath);//加载报表
                myReport.SetDataSource(list);//把数据附加到报表对象中
                crystalReportViewer1.ReportSource = myReport;//把对象的数据显示到报表中
            }
    
            //关系表转对象集合
            private List<Test> DataTableToList(DataTable dt)
            {
                List<Test> testList = new List<Test>();
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    Test test = new Test();
                    test.Id = Convert.ToInt32(dt.Rows[i]["Id"]);
                    test.Circult_Des = dt.Rows[i]["T_Circult_Des"].ToString();
                    test.Device_Type = dt.Rows[i]["T_Device_Type"].ToString();
                    test.Device_Rating = dt.Rows[i]["T_Device_Rating"].ToString();
                    test.Conductor_Live = dt.Rows[i]["T_Conductor_Live"].ToString();
                    test.Conductor_cpc = dt.Rows[i]["T_Conductor_cpc"].ToString();
                    test.Pro_conductor = Convert.ToBoolean(dt.Rows[i]["T_Pro_conductor"]);
                    test.Polarity = Convert.ToBoolean(dt.Rows[i]["T_Polarity"]);
                    testList.Add(test);
                }
                return testList;
            }
        }
    }
    Form2代码

    12.运行看看数据是否已成功绑定到水晶报表中了

    已成功的完成数据的绑定

    最后就需要根据需要,为报表添加线条作为边框美化一下,C#+水晶报表的使用原理就是这样的了。我下面就用文本框添加边框的方式添加的

     

     运行看看:

     

     是不是觉得上面的内容,本来想显示√的,真显示了个“真”,我们可以再水晶报表中写个公式,如果为真,显示√ 如果为假,则不显示

    同理 如果是true ,真显示OK,false显示“  ”一个空格

    在数据库中添加多条数据来展示

    保存PDF,PDF打开是这样的

     总结步骤:

     1. 在程序中新建一个水晶报表的模板

     2. 在程序中新建一个实体类,也就是用来绑定到报表上的数据源

     3. 查询出的数据,放到实体类的集合中,作为报表的源数据,这样就可以显示出来了。

     报表显示的主要代码如下

  • 相关阅读:
    C字符串处理函数
    C语言字符串函数大全
    那些闪亮的日子
    牛客网在线编程:幸运数
    牛客网在线编程:水仙花数
    [LeetCode]617.Merge Two Binary Trees
    [LeetCode]657.Judge Route Circle
    [LeetCode]141. Linked List Cycle
    五大算法:分治,贪心,动态规划,回溯,分支界定
    [LeetCode]387.First Unique Character in a String
  • 原文地址:https://www.cnblogs.com/qq605490312/p/6053121.html
Copyright © 2011-2022 走看看