• FastReport报表控件的使用


    转自小黑的博客

    这次的项目由于涉及到了打印输出,这样也就不得不要涉及一些打印预览功能,本来可以使用Crystal Report,但又通过别人介绍发现了一款制作更加精美,而且实用的FastReport控件,下面把项目中的小应用说道说道。

      首先,从官方网站可以下载到FastReport最新版本,安装时注意勾选"将FastReport控件添加到Visual Studio工具箱",安装完成后就可以看到控件列表了:

      FastReport报表控件的使用

      

      一、EnvironmentSettings的使用

      EnvironmentSettings顾名思义是环境设置,这里可以对其他的几个控件进行样式上的设置,不过个人感觉没啥必要了,因为原本的样式已经足够完美,所以这个直接Pass

      FastReport报表控件的使用

      二、DesignerControl的使用

      DesignerControl是FastReport的主设计界面,拖动控件进入窗体,可以看到基本的效果:

      FastReport报表控件的使用

      

      要让工作区能够正常使用,只需在窗体的Load事件中加入以下代码:   

    FastReport报表控件的使用代码
    1 //加载时新建一个报表,把他附加到设计器上
    2  
    3 Report report = new Report();
    4 designerControl1.Report = report;

    6 这时打开窗口,可以清晰的看到FastReport的工作区
    7 了,但同时还有个问题,就是在视图里面点击数据源、
    8 属性等看不到相应的窗口,这时再加一句代码刷新
    9 FastReport的工具箱和工具窗口的布局
    10 
    11 designerControl1.RefreshLayout();
    12  

      三、Report的使用

      PreviewControl就是预览数据显示效果的控件,不过一般不需要在窗体中拖拽使用,数据的预览需要FastReport的模板支持,FastReport中自带的模板默认都是以Northwind数据库的Employees表作为数据源的,这自然满足不了现实的需求,所以这里需要自己制作相应的模板, 首先进入数据菜单,选择添加数据源,加入自己需要显示的数据表,随后将其拖拽至设计界面的数据区,以常见的学生表为例,设计界面下的效果大致如下:

      FastReport报表控件的使用

      随后可以点击Ctrl+P预览,软件还自带了很多设计的样式,诸如模糊、滤镜、条纹、背景等等,仔细设计一下效果肯定会更好。。。。

      

      将模板保存回到窗体中,后台中编写如下代码:

      

    FastReport报表控件的使用代码
    public Form1()
    {
    InitializeComponent();
    InitialData();
    }

    private DataSet ds = null;

    private void InitialData()
    {
    SqlConnection con = new SqlConnection("server=.;database=XXX;uid=sa;");
    SqlDataAdapter adapter = new SqlDataAdapter("select * from Student", con);
    ds = new DataSet();
    adapter.Fill(ds);
    }

    private void button1_Click(object sender, EventArgs e)
    {
    //加载模板
    report1.Load(@"http://www.cnblogs.com/myx.frx");
    //加载数据
    report1.RegisterData(ds);
    //这样就可以预览数据了
    report1.Show();
    //释放资源
    report1.Dispose();
    }

       使用还是比较方便。。。。不过每次都要这样加载,貌似有些麻烦,我们可以将他以流的形式存储在一个XML文件中,从而方便访问。

      主设计器的代码如下:

      

    FastReport报表控件的使用代码
    private void Form1_Load(object sender, EventArgs e)
    {
    //加载工作区
    Report report = new Report();
    designerControl1.Report = report;
    designerControl1.RefreshLayout();

    //更改设计器的选择文件对话框和打开报表对话框
    Config.DesignerSettings.CustomOpenDialog += new FastReport.Design.
    OpenSaveDialogEventHandler
    (DesignerSettings_CustomOpenDialog);
    Config.DesignerSettings.CustomOpenReport += 
    new FastReport.Design.
    OpenSaveReportEventHandler(DesignerSettings_CustomOpenReport);

    //更改设计器的保存文件对话框和保存报表对话框
    Config.DesignerSettings.CustomSaveDialog += new FastReport.Design..
    OpenSaveDialogEventHandler
    (DesignerSettings_CustomSaveDialog);
    Config.DesignerSettings.CustomSaveReport += new FastReport.Design.
    OpenSaveReportEventHandler(DesignerSettings_CustomSaveReport);

    //得到当前模板信息
    GetRptTemplate();
    }

    //设置数据集
    private DataSet ds;
    private DataTable ReportTable
    {
    get
    {
    return this.ds.Tables[0];
    }
    }

    void DesignerSettings_CustomOpenDialog(object sender, FastReport.Design.
    OpenSaveDialogEventArgs e)

    {
    using (OpenForm openForm = new OpenForm())
    {
    //加载模板名
    openForm.ReportTable = ReportTable;
    //显示窗体
    DialogResult dr = openForm.ShowDialog();
    if (dr == DialogResult.OK)
    {
    //获取打开窗体选择的模板名
    e.FileName = openForm.SelectedReportName;
    }
    }
    }

    void DesignerSettings_CustomOpenReport(object sender, FastReport.Design.
    OpenSaveReportEventArgs e)

    {
    //打开模板
    OpenReportTemplate(e.Report, e.FileName);
    }

    void DesignerSettings_CustomSaveDialog(object sender, FastReport.Design.
    OpenSaveDialogEventArgs e)

    {
    using (SaveForm saveForm = new SaveForm())
    {
    //取得SaveForm保存的模板名
    e.FileName = saveForm.ReportName;
    }
    }

    void DesignerSettings_CustomSaveReport(object sender, FastReport.Design.
    OpenSaveReportEventArgs e)

    {
    //保存模板
    SaveReportTemplate(e.Report, e.FileName);
    }

    //读取报表模板信息
    private void GetRptTemplate()
    {
    ds = new DataSet();
    ds.ReadXml(Application.StartupPath + "\database.xml");
    }

    //写入报表模板信息
    private void WriteRptTemplate()
    {
    ds.WriteXml(Application.StartupPath + "\database.xml",
    XmlWriteMode.WriteSchema);
    }

    //打开报表模板
    private void OpenReportTemplate(Report report,
    string reportName)
    {
    foreach (DataRow dr in ReportTable.Rows)
    {
    if (dr["ReportName"].ToString() == reportName)
    {
    //读取模板信息,注意读取的是ReportStream,而不是ReportName
    byte[] reportBytes = (byte[])dr["ReportStream"];
    using (MemoryStream stream = new MemoryStream(reportBytes))
    {
    //加载报表
    report.Load(stream);
    }
    return;
    }
    }
    }

    //保存报表模板
    private void SaveReportTemplate(Report report, string reportName)
    {
    //如果现在有同名模板,则提示需要更换保存的模板名字
    foreach (DataRow dr in ReportTable.Rows)
    {
    if (dr["ReportName"].ToString() == reportName)
    {
    MessageBox.Show("现在有同名模板,请更换保
    存模板名后重试!", "系统提示!", MessageBoxButtons.OK, MessageBoxIcon.Information);
    return;
    }
    }

    //没有检测到同名模板,则向报表数据集中增加一个新行
    DataRow newRow = ReportTable.NewRow();
    ReportTable.Rows.Add(newRow);

    using (MemoryStream stream = new MemoryStream())
    {
    report.Save(stream);

    //写入xml配置文件
    newRow["ReportName"] = reportName;
    newRow["ReportStream"] = stream.ToArray();
    }
    }

        打开和保存模板的代码见DEMO,其实这些代码参照示例写出来的,大家可以去仔细研究下安装目录下的所有示例,俺这里还是要切合这个系列的主题嘛,做事有时还是要就事论事的,有时没有必要完全搞定所有的功能,先把需要实现的实现了再说^_^

      俺的DEMO: 下载

  • 相关阅读:
    November 07th, 2017 Week 45th Tuesday
    November 06th, 2017 Week 45th Monday
    November 05th, 2017 Week 45th Sunday
    November 04th, 2017 Week 44th Saturday
    November 03rd, 2017 Week 44th Friday
    Asp.net core 学习笔记 ( Area and Feature folder structure 文件结构 )
    图片方向 image orientation Exif
    Asp.net core 学习笔记 ( Router 路由 )
    Asp.net core 学习笔记 ( Configuration 配置 )
    qrcode render 二维码扫描读取
  • 原文地址:https://www.cnblogs.com/zyj-keyen/p/8537360.html
Copyright © 2020-2023  润新知