Winform项目中使用FastReport.Net报表控件

作者:springsnow 时间:2022-01-16 11:08:27 

一、基本使用

1、准备工程和引入控件

1、下载、安装FastReport

这一步很简单,大家在其中文网站上下载最新版的demo版就可以了,直接安装就可以

Winform项目中使用FastReport.Net报表控件

替换破解文件:

Replace C:\Windows\Microsoft.NET\assembly\GAC_MSIL\FastReport\v4.0_2019.1.5.0__00000000000000000000000000\FastReport.dll with cracked one.

Winform项目中使用FastReport.Net报表控件

Assemblies from folders Framework X.0 is PublicKeyToken removed and strong name verification disabled.

安装之后大家会发现,VS里面什么都没有,不像有些插件直接会在ToolBox里显示,这里需要我们自己引入

2、准备工程、引入控件

首先我们使用VS新建一个WinForm工程,这里我使用的是VisualStutio2015版本

Winform项目中使用FastReport.Net报表控件

接着我们先引入FastReport的核心dll依赖,这些文件的目录在FastReport安装目录下,分别是FastReport.dll,FastReport.Editor.dll,FastReport.Bars.dll。

你可以使用Framework 4.0下的dll文件

Winform项目中使用FastReport.Net报表控件

Winform项目中使用FastReport.Net报表控件

接着我们需要3个窗体:MainForm,DesignForm,PreviewForm,其中MainForm为启动页面

Winform项目中使用FastReport.Net报表控件

现在我们需要在ToolsBox中引入我们需要的FastReport控件,首先我们在ToolsBox中新建一个Item,命名为FastReport

Winform项目中使用FastReport.Net报表控件

然后右键刚刚新建的选项卡->选择项,打开选择控件的对话框

Winform项目中使用FastReport.Net报表控件

然后我们点击左下角的浏览,选择刚刚的FastReport.dll,然后确定,之后再确定,就会成功导入以下新的控件

Winform项目中使用FastReport.Net报表控件

3、启动页设计

MainForm很简单,我们就放两个按钮,一个设计,一个浏览,分别打开两个窗口

Winform项目中使用FastReport.Net报表控件

事件

private void btnDesign_Click(object sender, EventArgs e)
{
   DesignForm dForm = new DesignForm();
   dForm.Show();

}

private void btnPreview_Click(object sender, EventArgs e)
{
   PreviewForm pForm = new PreviewForm();
   pForm.Show();
}

2、使用控件搭建窗体

1、准备一个FastReport报表

使用安装时我们的设计工具设计一张最简单的报表

Winform项目中使用FastReport.Net报表控件

Winform项目中使用FastReport.Net报表控件

设计的报表,只有一个文字框

将这份报表保存到工程文件/bin/Debug/Report下

Winform项目中使用FastReport.Net报表控件

2、引入Preview控件

我们在PreviewForm中,将PreviewControl控件拖入窗体,将窗体拉大一点,然后将控件的Dock设为Fill

Winform项目中使用FastReport.Net报表控件

然后我们F5测试一下看看是什么效果

我们发现控件被正确的显示出来了

那怎么才能看到我们报表呢,我们需要用代码来加载,我们双击Form,新建Load函数,打下面的代码

using FastReport;//引入FastReport
using System;
using System.Windows.Forms;

namespace ReportDemo
{
   public partial class PreviewForm : Form
   {
       private Report pReport; //新建一个私有变量

public PreviewForm()
       {
           InitializeComponent();
       }

private void PreviewForm_Load(object sender, EventArgs e)
       {
           pReport = new Report();   //实例化一个Report报表
           String reportFile = "Report/report.frx";
           pReport.Load(reportFile);  //载入报表文件
           pReport.Preview = previewControl1; //设置报表的Preview控件(这里的previewControl1就是我们之前拖进去的那个)
           pReport.Prepare();   //准备
           pReport.ShowPrepared();  //显示
       }
   }
}

我们再F5一下,载入了报表文件的样子

Winform项目中使用FastReport.Net报表控件

这里我们已经可以预览我们的报表了 但是在我们的需求中,用户还需要自定义报表的内容和格式呢,我们下一步就在实现报表设计器

3、引入Design控件

我们像Preview那样把Design控件拖进DesignForm,然后Dock设为Fill

Winform项目中使用FastReport.Net报表控件

然后我们来写怎么样吧设计器绑定Report文件,双击新建Load函数,引入FastReport,新建一个private变量

using FastReport;
using System;
using System.Windows.Forms;

namespace ReportDemo
{
   public partial class DesignForm : Form
   {
       private Report dReport;

public DesignForm()
       {
           InitializeComponent();
       }

private void DesignForm_Load(object sender, EventArgs e)
       {
           dReport = new Report();
           string reportFile = "Report/report.frx";
           dReport.Load(reportFile);
           this.designerControl1.Report = dReport;
           dReport.Prepare();
           dReport.Design();
       }
   }
}

我们F5一下

Winform项目中使用FastReport.Net报表控件

成功!

3、绑定数据

1、数据库准备

我们使用VisualStudio自带的mdf文件数据库,首先我们在工程中创建一个文件夹APP_DATA,在此文件夹中创建一个mdf文件

Winform项目中使用FastReport.Net报表控件

然后我们可以在服务器资源管理器中看到我们的数据库

Winform项目中使用FastReport.Net报表控件

然后我们右键表新建一个表

CREATE TABLE [dbo].[T_students]
(
   [Id] INT NOT NULL PRIMARY KEY IDENTITY,
   [no] NCHAR(50) NULL,
   [name] NCHAR(50) NULL,
   [school] NCHAR(50) NULL,
   [class] NCHAR(50) NULL
)

然后在设计器左上角点击更新按钮,在弹出的窗口中点击更新数据库

Winform项目中使用FastReport.Net报表控件

更状态全部打钩之后,表就创建好了,我们刷新服务器资源管理器,然后打开表数据,添加一些数据进去

Winform项目中使用FastReport.Net报表控件

ok我们现在在服务器资源管理器里面选择mdf文件,在属性列表里,找到连接字符串,拷贝一份出来,等会需要用的到

Winform项目中使用FastReport.Net报表控件

Data Source=(LocalDB)\v11.0;AttachDbFilename="D:\Personal\Documents\Visual Studio 2012\Projects\WindowsFormsApplication3\WindowsFormsApplication3\APP_DATA\Database1.mdf";Integrated Security=True

2、设计器数据获取

我们在DesignForm.cs里,写一个方法getData()

private DataSet getData()
{
   String connStr = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=D:\Personal\Documents\Visual Studio 2012\Projects\WindowsFormsApplication3\WindowsFormsApplication3\APP_DATA\Database1.mdf;Integrated Security=True";
   SqlConnection conn = new SqlConnection(connStr);
   conn.Open();
   String sqlStr = "SELECT * FROM T_students";
   SqlCommand comm = new SqlCommand();
   comm.CommandText = sqlStr;
   comm.CommandType = CommandType.Text;
   comm.Connection = conn;
   DataSet ds = new DataSet();
   SqlDataAdapter adapter = new SqlDataAdapter(comm);
   adapter.Fill(ds, "学生信息");
   conn.Close();
   return ds;
}

然后我们在Form_Load方法里绑定数据集

private void DesignForm_Load(object sender, EventArgs e)
{
   dReport = new Report();
   string reportFile = "Report/report.frx";
   dReport.Load(reportFile);
   this.designerControl1.Report = dReport;

DataSet ds = new DataSet();
   ds = getData();
   dReport.RegisterData(ds, "学生信息");
   dReport.Prepare();
   dReport.Design();
}

我们F5一下,在设计窗口下,在[数据]->[选择数据源]中,就能看到我们绑定的数据了

Winform项目中使用FastReport.Net报表控件

我们设计一个表格,把我们的数据放进去

Winform项目中使用FastReport.Net报表控件

我们可以预览一下,然后保存

3、为Preview绑定数据

现在我们用同样的方法为Preview绑定数据,getData()方法一致,可以直接复制过来

private void PreviewForm_Load(object sender, EventArgs e)
{
   pReport = new Report();   //实例化一个Report报表
   String reportFile = "Report/report.frx";
   pReport.Load(reportFile);  //载入报表文件
   pReport.Preview = previewControl1; //设置报表的Preview控件(这里的previewControl1就是我们之前拖进去的那个)
   DataSet ds = new DataSet();
   ds = getData();
   pReport.RegisterData(ds, "学生信息");
   pReport.Prepare();   //准备
   pReport.ShowPrepared();  //显示
}

我们测试一下

Winform项目中使用FastReport.Net报表控件

二、用户自定义报表,可保存到服务器和打开。

摘自官方Demo:

Winform项目中使用FastReport.Net报表控件

调用设计器界面

Winform项目中使用FastReport.Net报表控件

首页代码

public partial class Form1 : Form
{
   private DataSet FReportsDs;

private DataTable ReportsTable
   {
       get { return FReportsDs.Tables[0]; }
   }

public Form1()
   {
       InitializeComponent();
   }

private void InitializeDatabase()
   {
       FReportsDs = new DataSet();
       FReportsDs.ReadXml(Config.ApplicationFolder + @"..\..\database.xml");
   }

private void FinalizeDatabase()
   {
       FReportsDs.WriteXml(Config.ApplicationFolder + @"..\..\database.xml", XmlWriteMode.WriteSchema);
   }

private void WireupDesignerEvents()
   {
       Config.DesignerSettings.CustomOpenDialog += new OpenSaveDialogEventHandler(DesignerSettings_CustomOpenDialog);
       Config.DesignerSettings.CustomOpenReport += new OpenSaveReportEventHandler(DesignerSettings_CustomOpenReport);
       Config.DesignerSettings.CustomSaveDialog += new OpenSaveDialogEventHandler(DesignerSettings_CustomSaveDialog);
       Config.DesignerSettings.CustomSaveReport += new OpenSaveReportEventHandler(DesignerSettings_CustomSaveReport);
   }

private void DesignReport()
   {
       using (Report report = new Report())
       {
           report.LoadBaseReport += new CustomLoadEventHandler(report_LoadBaseReport);
           report.Design();
       }
   }

// this event is fired when loading a base part of an inherited report.
   private void report_LoadBaseReport(object sender, CustomLoadEventArgs e)
   {
       OpenReport(e.Report, e.FileName);
   }

// this event is fired when the user press the "Open file" button
   private void DesignerSettings_CustomOpenDialog(object sender, OpenSaveDialogEventArgs e)
   {
       using (OpenDialogForm form = new OpenDialogForm())
       {
           // pass the reports table to display a list of reports
           form.ReportsTable = ReportsTable;

// show dialog
           e.Cancel = form.ShowDialog() != DialogResult.OK;

// return the selected report in the e.FileName
           e.FileName = form.ReportName;
       }
   }

// this event is fired when report needs to be loaded
   private void DesignerSettings_CustomOpenReport(object sender, OpenSaveReportEventArgs e)
   {
       OpenReport(e.Report, e.FileName);
   }

// this event is fired when the user press the "Save file" button to save untitled report,
   // or "Save file as" button
   private void DesignerSettings_CustomSaveDialog(object sender, OpenSaveDialogEventArgs e)
   {
       using (SaveDialogForm form = new SaveDialogForm())
       {
           // show dialog
           e.Cancel = form.ShowDialog() != DialogResult.OK;

// return the report name in the e.FileName
           e.FileName = form.ReportName;
       }
   }

// this event is fired when report needs to be saved
   private void DesignerSettings_CustomSaveReport(object sender, OpenSaveReportEventArgs e)
   {
       SaveReport(e.Report, e.FileName);
   }

private void OpenReport(Report report, string reportName)
   {
       // find the datarow with specified ReportName
       foreach (DataRow row in ReportsTable.Rows)
       {
           if ((string)row["ReportName"] == reportName)
           {
               // load the report from a stream contained in the "ReportStream" datacolumn
               byte[] reportBytes = (byte[])row["ReportStream"];
               using (MemoryStream stream = new MemoryStream(reportBytes))
               {
                   report.Load(stream);
               }
               return;
           }
       }
   }

private void SaveReport(Report report, string reportName)
   {
       // find the datarow with specified ReportName
       DataRow reportRow = null;

foreach (DataRow row in ReportsTable.Rows)
       {
           if ((string)row["ReportName"] == reportName)
           {
               reportRow = row;
               break;
           }
       }

// no existing row found, append new one
       if (reportRow == null)
       {
           reportRow = ReportsTable.NewRow();
           ReportsTable.Rows.Add(reportRow);
       }

// save the report to a stream, then put byte[] array to the datarow
       using (MemoryStream stream = new MemoryStream())
       {
           report.Save(stream);

reportRow["ReportName"] = reportName;
           reportRow["ReportStream"] = stream.ToArray();
       }
   }

private void Form1_Load(object sender, EventArgs e)
   {
       InitializeDatabase();
       WireupDesignerEvents();
   }

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
   {
       FinalizeDatabase();
   }

private void btnDesign_Click(object sender, EventArgs e)
   {
       DesignReport();
   }
}

打开对话框:

Winform项目中使用FastReport.Net报表控件

public partial class OpenDialogForm : Form
{
   public DataTable ReportsTable
   {
       set
       {
           // fill the listbox with names of reports
           foreach (DataRow row in value.Rows)
           {
               lbxReports.Items.Add(row["ReportName"]);
           }
       }
   }

public string ReportName
   {
       get
       {
           return (string)lbxReports.SelectedItem;
       }
   }

public OpenDialogForm()
   {
       InitializeComponent();
   }

private void lbxReports_SelectedIndexChanged(object sender, EventArgs e)
   {
       btnOK.Enabled = !String.IsNullOrEmpty(ReportName);
   }
}

保存对话框

Winform项目中使用FastReport.Net报表控件

public partial class SaveDialogForm : Form
{
   public string ReportName
   {
       get
       {
           return tbReportName.Text;
       }
   }

public SaveDialogForm()
   {
       InitializeComponent();
   }

private void tbReportName_TextChanged(object sender, EventArgs e)
   {
       btnOK.Enabled = !String.IsNullOrEmpty(ReportName);
   }
}

参考:使用report.ReportResourceString在数据库中保存FastReport.Net报表

https://www.jb51.net/article/250713.htm

控件下载

点此下载

来源:https://www.cnblogs.com/springsnow/p/12960566.html

标签:C#,Winform,FastReport.Net,报表,控件
0
投稿

猜你喜欢

  • WPF MVVM制作发送短信小按钮

    2021-10-26 09:48:12
  • springboot如何使用logback-spring配置日志格式,并分环境配置

    2023-11-10 04:37:34
  • Android滑动组件悬浮固定在顶部效果

    2022-12-13 19:24:32
  • Android Studio搜索功能(查找功能)及快捷键图文详解

    2021-10-23 08:47:20
  • android开发教程之wifi开发示例

    2022-03-04 11:05:47
  • Spring @EventListener 异步中使用condition的问题及处理

    2023-07-07 21:42:16
  • 第一次使用Android Studio时你应该知道的一切配置(推荐)

    2022-01-08 00:49:38
  • 利用Spring Data MongoDB持久化文档数据的方法教程

    2023-05-05 02:36:54
  • C#中的虚函数virtual

    2023-09-07 13:49:53
  • Android 自定义View实现任意布局的RadioGroup效果

    2021-08-07 16:20:24
  • Android自定义View实现BMI指数条

    2021-08-28 18:12:12
  • 手动编译C#代码的方法

    2021-05-27 05:42:40
  • 最小树形图模板朱刘算法分享

    2023-11-07 07:04:38
  • C# Math中常用数学运算的示例详解

    2023-10-06 23:06:28
  • Android viewpager自动轮播和小圆点联动效果

    2023-08-06 21:42:41
  • 基于Android平台实现拼图小游戏

    2021-07-27 16:48:12
  • 浅谈Java三目运算

    2023-11-29 07:27:59
  • springboot前后台数据交互的示例代码

    2023-11-26 21:15:07
  • 详解C#中检查null的语法糖

    2023-08-12 11:20:08
  • WCF实现进程间管道通信Demo分享

    2022-10-22 04:20:06
  • asp之家 软件编程 m.aspxhome.com