• 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: 下载

  • 相关阅读:
    树的递归
    《计算机存储与外设》 3二级存储器
    《计算机存储与外设》 2主存储器
    《码农翻身:用故事给技术加点料》阅读有感
    分析"傍富婆发财"
    《第22条军规》Catch-22
    《编译原理》4
    《编译原理》3
    《血酬定律》
    linux下netcore程序部署
  • 原文地址:https://www.cnblogs.com/bestlove/p/12904172.html
Copyright © 2020-2023  润新知