Winform项目中使用FastReport.Net报表控件
作者:springsnow 发布时间:2022-01-16 11:08:27
一、基本使用
1、准备工程和引入控件
1、下载、安装FastReport
这一步很简单,大家在其中文网站上下载最新版的demo版就可以了,直接安装就可以
替换破解文件:
Replace C:\Windows\Microsoft.NET\assembly\GAC_MSIL\FastReport\v4.0_2019.1.5.0__00000000000000000000000000\FastReport.dll with cracked one.
Assemblies from folders Framework X.0 is PublicKeyToken removed and strong name verification disabled.
安装之后大家会发现,VS里面什么都没有,不像有些插件直接会在ToolBox里显示,这里需要我们自己引入
2、准备工程、引入控件
首先我们使用VS新建一个WinForm工程,这里我使用的是VisualStutio2015版本
接着我们先引入FastReport的核心dll依赖,这些文件的目录在FastReport安装目录下,分别是FastReport.dll,FastReport.Editor.dll,FastReport.Bars.dll。
你可以使用Framework 4.0下的dll文件
接着我们需要3个窗体:MainForm,DesignForm,PreviewForm,其中MainForm为启动页面
现在我们需要在ToolsBox中引入我们需要的FastReport控件,首先我们在ToolsBox中新建一个Item,命名为FastReport
然后右键刚刚新建的选项卡->选择项,打开选择控件的对话框
然后我们点击左下角的浏览,选择刚刚的FastReport.dll,然后确定,之后再确定,就会成功导入以下新的控件
3、启动页设计
MainForm很简单,我们就放两个按钮,一个设计,一个浏览,分别打开两个窗口
事件
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报表
使用安装时我们的设计工具设计一张最简单的报表
设计的报表,只有一个文字框
将这份报表保存到工程文件/bin/Debug/Report下
2、引入Preview控件
我们在PreviewForm中,将PreviewControl控件拖入窗体,将窗体拉大一点,然后将控件的Dock设为Fill
然后我们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一下,载入了报表文件的样子
这里我们已经可以预览我们的报表了 但是在我们的需求中,用户还需要自定义报表的内容和格式呢,我们下一步就在实现报表设计器
3、引入Design控件
我们像Preview那样把Design控件拖进DesignForm,然后Dock设为Fill
然后我们来写怎么样吧设计器绑定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一下
成功!
3、绑定数据
1、数据库准备
我们使用VisualStudio自带的mdf文件数据库,首先我们在工程中创建一个文件夹APP_DATA,在此文件夹中创建一个mdf文件
然后我们可以在服务器资源管理器中看到我们的数据库
然后我们右键表新建一个表
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
)
然后在设计器左上角点击更新按钮,在弹出的窗口中点击更新数据库
更状态全部打钩之后,表就创建好了,我们刷新服务器资源管理器,然后打开表数据,添加一些数据进去
ok我们现在在服务器资源管理器里面选择mdf文件,在属性列表里,找到连接字符串,拷贝一份出来,等会需要用的到
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一下,在设计窗口下,在[数据]->[选择数据源]中,就能看到我们绑定的数据了
我们设计一个表格,把我们的数据放进去
我们可以预览一下,然后保存
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(); //显示
}
我们测试一下
二、用户自定义报表,可保存到服务器和打开。
摘自官方Demo:
调用设计器界面
首页代码
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();
}
}
打开对话框:
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);
}
}
保存对话框
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


猜你喜欢
- session失效时间 在Tomcat上,session的默认有效时间是30分钟。也可以通过配置文件修改session的有效时间。
- Spring JPA 增加字段执行异常用Spring jpa Entity里面增加了几个字段,但启动报错,提示column Unable t
- WPF 窗体设置亚克力效果框架使用大于等于.NET40。Visual Studio 2022。项目使用 MIT 开源许可
- springboot http转https一、安全证书的生成可以使用jdk自带的证书生成工具,jdk自带一个叫keytool的证书管理工具,
- 1.注解声明:通过@interface就可以声明一个注解。@Target(ElementType.FIELD)@Retention(Rete
- Android Studio Intent隐式启动,发短信,拨号,打电话,访问网页等实例代码功能创建5个按钮,隐式启动、发短信、拨号按钮、电
- 一、概述今天给大家带来SurfaceView的一个实战案例,话说自定义View也是各种写,一直没有写过SurfaceView,这个玩意是什么
- 本文实例讲述了WinForm调用jar包的方法。分享给大家供大家参考,具体如下:因为工作需要,需要做一个数据上传的程序,客户规定的是:数据接
- 本文实例为大家分享了TabLayout结合ViewPager实现页面切换效果的具体代码,供大家参考,具体内容如下先看看效果,如图:1.因为T
- mybatis count()按条件查询1、sql count()函数count()函数返回匹配指定条件的行数。sql count(colu
- 一.需求使用JAVA实现单链表,使用单链表检测字符串是否是回文串二.需求分析回文串最重要的就是对称,那么最重要的问题就是找到那个中心,用快指
- 前言当某个事件需要被监听的时候,我们需要去做其他的事前,最简单的方式就是将自己的业务 方法追加到该事件之后。但是当有N多个这样的需求的时候我
- 目录1.跳转控制语句:区分continue和break; * continue:用于循环中,基于条件控制,跳过某次循环体内容的执行
- 自动去除图像扫描黑边/// <summary>  
- 前言前面几篇我们学习的都是单表查询,就是对一张表中的数据进行查询。而实际项目中,基本都会有多张表联合查询的情况,今天我们就来了解下JPA的联
- 本文实例讲述了Android结束进程的方法。分享给大家供大家参考,具体如下:最近在做一个类似与任务管理器的东西,里面有个功能,可以通过这个管
- 本文使用Matrix实现Android实现图片缩放与旋转。示例代码如下:package com.android.matrix;import
- 在本文中,对比了常见的几种反射的方法,介绍了它们分别应该如何使用,每种的简易度和灵活度,然后做了基准测试,一起看看这之间的性能差距。按照使用
- 最初,XML 语言仅仅是意图用来作为 HTML 语言的替代品而出现的,但是随着该语言的不断发展和完善,人们越来越发现它所具有的优点:例如标记
- 简介本文主要讲解java代码如何利用selenium操作浏览器上传和下载文件代码教程。上传文件常见的 web 页面的上传,一般使用 inpu