Winform項(xiàng)目中使用FastReport.Net報(bào)表控件
一、基本使用
1、準(zhǔn)備工程和引入控件
1、下載、安裝FastReport
這一步很簡單,大家在其中文網(wǎng)站上下載最新版的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.
安裝之后大家會(huì)發(fā)現(xiàn),VS里面什么都沒有,不像有些插件直接會(huì)在ToolBox里顯示,這里需要我們自己引入
2、準(zhǔn)備工程、引入控件
首先我們使用VS新建一個(gè)WinForm工程,這里我使用的是VisualStutio2015版本

接著我們先引入FastReport的核心dll依賴,這些文件的目錄在FastReport安裝目錄下,分別是FastReport.dll,FastReport.Editor.dll,FastReport.Bars.dll。
你可以使用Framework 4.0下的dll文件


接著我們需要3個(gè)窗體:MainForm,DesignForm,PreviewForm,其中MainForm為啟動(dòng)頁面

現(xiàn)在我們需要在ToolsBox中引入我們需要的FastReport控件,首先我們?cè)赥oolsBox中新建一個(gè)Item,命名為FastReport

然后右鍵剛剛新建的選項(xiàng)卡->選擇項(xiàng),打開選擇控件的對(duì)話框

然后我們點(diǎn)擊左下角的瀏覽,選擇剛剛的FastReport.dll,然后確定,之后再確定,就會(huì)成功導(dǎo)入以下新的控件

3、啟動(dòng)頁設(shè)計(jì)
MainForm很簡單,我們就放兩個(gè)按鈕,一個(gè)設(shè)計(jì),一個(gè)瀏覽,分別打開兩個(gè)窗口

事件
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、準(zhǔn)備一個(gè)FastReport報(bào)表
使用安裝時(shí)我們的設(shè)計(jì)工具設(shè)計(jì)一張最簡單的報(bào)表


設(shè)計(jì)的報(bào)表,只有一個(gè)文字框
將這份報(bào)表保存到工程文件/bin/Debug/Report下

2、引入Preview控件
我們?cè)赑reviewForm中,將PreviewControl控件拖入窗體,將窗體拉大一點(diǎn),然后將控件的Dock設(shè)為Fill

然后我們F5測試一下看看是什么效果
我們發(fā)現(xiàn)控件被正確的顯示出來了
那怎么才能看到我們報(bào)表呢,我們需要用代碼來加載,我們雙擊Form,新建Load函數(shù),打下面的代碼
using FastReport;//引入FastReport
using System;
using System.Windows.Forms;
namespace ReportDemo
{
public partial class PreviewForm : Form
{
private Report pReport; //新建一個(gè)私有變量
public PreviewForm()
{
InitializeComponent();
}
private void PreviewForm_Load(object sender, EventArgs e)
{
pReport = new Report(); //實(shí)例化一個(gè)Report報(bào)表
String reportFile = "Report/report.frx";
pReport.Load(reportFile); //載入報(bào)表文件
pReport.Preview = previewControl1; //設(shè)置報(bào)表的Preview控件(這里的previewControl1就是我們之前拖進(jìn)去的那個(gè))
pReport.Prepare(); //準(zhǔn)備
pReport.ShowPrepared(); //顯示
}
}
}我們?cè)貴5一下,載入了報(bào)表文件的樣子

這里我們已經(jīng)可以預(yù)覽我們的報(bào)表了 但是在我們的需求中,用戶還需要自定義報(bào)表的內(nèi)容和格式呢,我們下一步就在實(shí)現(xiàn)報(bào)表設(shè)計(jì)器
3、引入Design控件
我們像Preview那樣把Design控件拖進(jìn)DesignForm,然后Dock設(shè)為Fill

然后我們來寫怎么樣吧設(shè)計(jì)器綁定Report文件,雙擊新建Load函數(shù),引入FastReport,新建一個(gè)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、綁定數(shù)據(jù)
1、數(shù)據(jù)庫準(zhǔn)備
我們使用VisualStudio自帶的mdf文件數(shù)據(jù)庫,首先我們?cè)诠こ讨袆?chuàng)建一個(gè)文件夾APP_DATA,在此文件夾中創(chuàng)建一個(gè)mdf文件

然后我們可以在服務(wù)器資源管理器中看到我們的數(shù)據(jù)庫

然后我們右鍵表新建一個(gè)表
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
)然后在設(shè)計(jì)器左上角點(diǎn)擊更新按鈕,在彈出的窗口中點(diǎn)擊更新數(shù)據(jù)庫

更狀態(tài)全部打鉤之后,表就創(chuàng)建好了,我們刷新服務(wù)器資源管理器,然后打開表數(shù)據(jù),添加一些數(shù)據(jù)進(jìn)去

ok我們現(xiàn)在在服務(wù)器資源管理器里面選擇mdf文件,在屬性列表里,找到連接字符串,拷貝一份出來,等會(huì)需要用的到

Data Source=(LocalDB)\v11.0;AttachDbFilename="D:\Personal\Documents\Visual Studio 2012\Projects\WindowsFormsApplication3\WindowsFormsApplication3\APP_DATA\Database1.mdf";Integrated Security=True
2、設(shè)計(jì)器數(shù)據(jù)獲取
我們?cè)贒esignForm.cs里,寫一個(gè)方法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, "學(xué)生信息");
conn.Close();
return ds;
}然后我們?cè)贔orm_Load方法里綁定數(shù)據(jù)集
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, "學(xué)生信息");
dReport.Prepare();
dReport.Design();
}我們F5一下,在設(shè)計(jì)窗口下,在[數(shù)據(jù)]->[選擇數(shù)據(jù)源]中,就能看到我們綁定的數(shù)據(jù)了

我們?cè)O(shè)計(jì)一個(gè)表格,把我們的數(shù)據(jù)放進(jìn)去

我們可以預(yù)覽一下,然后保存
3、為Preview綁定數(shù)據(jù)
現(xiàn)在我們用同樣的方法為Preview綁定數(shù)據(jù),getData()方法一致,可以直接復(fù)制過來
private void PreviewForm_Load(object sender, EventArgs e)
{
pReport = new Report(); //實(shí)例化一個(gè)Report報(bào)表
String reportFile = "Report/report.frx";
pReport.Load(reportFile); //載入報(bào)表文件
pReport.Preview = previewControl1; //設(shè)置報(bào)表的Preview控件(這里的previewControl1就是我們之前拖進(jìn)去的那個(gè))
DataSet ds = new DataSet();
ds = getData();
pReport.RegisterData(ds, "學(xué)生信息");
pReport.Prepare(); //準(zhǔn)備
pReport.ShowPrepared(); //顯示
}我們測試一下

二、用戶自定義報(bào)表,可保存到服務(wù)器和打開。
摘自官方Demo:

調(diào)用設(shè)計(jì)器界面

首頁代碼
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();
}
}打開對(duì)話框:

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);
}
}保存對(duì)話框

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在數(shù)據(jù)庫中保存FastReport.Net報(bào)表
http://www.dbjr.com.cn/article/250713.htm
控件下載
到此這篇關(guān)于Winform項(xiàng)目中使用FastReport.Net報(bào)表控件的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
unity使用socket編程實(shí)現(xiàn)聊天室功能
這篇文章主要為大家詳細(xì)介紹了unity使用socket編程實(shí)現(xiàn)聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Unity技術(shù)手冊(cè)之Toggle切換使用實(shí)例
這篇文章主要為大家介紹了Unity技術(shù)手冊(cè)之Toggle切換使用實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
c#中SqlHelper封裝SqlDataReader的方法
這篇文章主要介紹了c#中SqlHelper封裝SqlDataReader的方法,涉及C#針對(duì)數(shù)據(jù)庫相關(guān)操作封裝與使用的技巧,需要的朋友可以參考下2015-05-05

