发布时间:2025-12-10 19:16:26 浏览次数:9
FastReport报表控件的使用「终于解决」转自小黑的博客这次的项目由于涉及到了打印输出,这样也就不得不要涉及一些打印预览功能,本来可以使用CrystalReport,但又通过别人介绍发现了一款制作更加精美,而且实用的FastReport控件,下面把项目中的小应用说道说道。首先,从官方网站可以下载到FastReport最新版本,安装时注
转自小黑的博客
这次的项目由于涉及到了打印输出,这样也就不得不要涉及一些打印预览功能,本来可以使用Crystal Report,但又通过别人介绍发现了一款制作更加精美,而且实用的FastReport控件,下面把项目中的小应用说道说道。
首先,从官方网站可以下载到FastReport最新版本,安装时注意勾选”将FastReport控件添加到Visual Studio工具箱”,安装完成后就可以看到控件列表了:
一、EnvironmentSettings的使用
EnvironmentSettings顾名思义是环境设置,这里可以对其他的几个控件进行样式上的设置,不过个人感觉没啥必要了,因为原本的样式已经足够完美,所以这个直接Pass
二、DesignerControl的使用
DesignerControl是FastReport的主设计界面,拖动控件进入窗体,可以看到基本的效果:
要让工作区能够正常使用,只需在窗体的Load事件中加入以下代码:
代码 1//加载时新建一个报表,把他附加到设计器上三、Report的使用
PreviewControl就是预览数据显示效果的控件,不过一般不需要在窗体中拖拽使用,数据的预览需要FastReport的模板支持,FastReport中自带的模板默认都是以Northwind数据库的Employees表作为数据源的,这自然满足不了现实的需求,所以这里需要自己制作相应的模板,首先进入数据菜单,选择添加数据源,加入自己需要显示的数据表,随后将其拖拽至设计界面的数据区,以常见的学生表为例,设计界面下的效果大致如下:
随后可以点击Ctrl+P预览,软件还自带了很多设计的样式,诸如模糊、滤镜、条纹、背景等等,仔细设计一下效果肯定会更好。。。。
将模板保存回到窗体中,后台中编写如下代码:
代码 publicForm1()
privateDataSet ds=null;
privatevoidInitialData()
{
SqlConnection con=newSqlConnection(“server=.;database=XXX;uid=sa;”);
SqlDataAdapter adapter=newSqlDataAdapter(“select * from Student”, con);
ds=newDataSet();
adapter.Fill(ds);
}
privatevoidbutton1_Click(objectsender, EventArgs e)
{
//加载模板
report1.Load(@”http://www.cnblogs.com/myx.frx”);
//加载数据
report1.RegisterData(ds);
//这样就可以预览数据了
report1.Show();
//释放资源
report1.Dispose();
}
使用还是比较方便。。。。不过每次都要这样加载,貌似有些麻烦,我们可以将他以流的形式存储在一个XML文件中,从而方便访问。
主设计器的代码如下:
代码 privatevoidForm1_Load(objectsender, EventArgs e)
//更改设计器的选择文件对话框和打开报表对话框
Config.DesignerSettings.CustomOpenDialog+=newFastReport.Design.
OpenSaveDialogEventHandler
(DesignerSettings_CustomOpenDialog);
Config.DesignerSettings.CustomOpenReport+=
newFastReport.Design.
OpenSaveReportEventHandler(DesignerSettings_CustomOpenReport);
//更改设计器的保存文件对话框和保存报表对话框
Config.DesignerSettings.CustomSaveDialog+=newFastReport.Design..
OpenSaveDialogEventHandler
(DesignerSettings_CustomSaveDialog);
Config.DesignerSettings.CustomSaveReport+=newFastReport.Design.
OpenSaveReportEventHandler(DesignerSettings_CustomSaveReport);
//得到当前模板信息
GetRptTemplate();
}
//设置数据集
privateDataSet ds;
privateDataTable ReportTable
{
get
{
returnthis.ds.Tables[0];
}
}
voidDesignerSettings_CustomOpenDialog(objectsender, FastReport.Design.
OpenSaveDialogEventArgs e)
{
using(OpenForm openForm=newOpenForm())
{
//加载模板名
openForm.ReportTable=ReportTable;
//显示窗体
DialogResult dr=openForm.ShowDialog();
if(dr==DialogResult.OK)
{
//获取打开窗体选择的模板名
e.FileName=openForm.SelectedReportName;
}
}
}
voidDesignerSettings_CustomOpenReport(objectsender, FastReport.Design.
OpenSaveReportEventArgs e)
{
//打开模板
OpenReportTemplate(e.Report, e.FileName);
}
voidDesignerSettings_CustomSaveDialog(objectsender, FastReport.Design.
OpenSaveDialogEventArgs e)
{
using(SaveForm saveForm=newSaveForm())
{
//取得SaveForm保存的模板名
e.FileName=saveForm.ReportName;
}
}
voidDesignerSettings_CustomSaveReport(objectsender, FastReport.Design.
OpenSaveReportEventArgs e)
{
//保存模板
SaveReportTemplate(e.Report, e.FileName);
}
//读取报表模板信息
privatevoidGetRptTemplate()
{
ds=newDataSet();
ds.ReadXml(Application.StartupPath+“\\database.xml”);
}
//写入报表模板信息
privatevoidWriteRptTemplate()
{
ds.WriteXml(Application.StartupPath+“\\database.xml”,
XmlWriteMode.WriteSchema);
}
//打开报表模板
privatevoidOpenReportTemplate(Report report,
stringreportName)
{
foreach(DataRow drinReportTable.Rows)
{
if(dr[“ReportName”].ToString()==reportName)
{
//读取模板信息,注意读取的是ReportStream,而不是ReportName
byte[] reportBytes=(byte[])dr[“ReportStream”];
using(MemoryStream stream=newMemoryStream(reportBytes))
{
//加载报表
report.Load(stream);
}
return;
}
}
}
//保存报表模板
privatevoidSaveReportTemplate(Report report,stringreportName)
{
//如果现在有同名模板,则提示需要更换保存的模板名字
foreach(DataRow drinReportTable.Rows)
{
if(dr[“ReportName”].ToString()==reportName)
{
MessageBox.Show(“现在有同名模板,请更换保
存模板名后重试!”,“系统提示!”, MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}
//没有检测到同名模板,则向报表数据集中增加一个新行
DataRow newRow=ReportTable.NewRow();
ReportTable.Rows.Add(newRow);
using(MemoryStream stream=newMemoryStream())
{
report.Save(stream);
//写入xml配置文件
newRow[“ReportName”]=reportName;
newRow[“ReportStream”]=stream.ToArray();
}
}
打开和保存模板的代码见DEMO,其实这些代码参照示例写出来的,大家可以去仔细研究下安装目录下的所有示例,俺这里还是要切合这个系列的主题嘛,做事有时还是要就事论事的,有时没有必要完全搞定所有的功能,先把需要实现的实现了再说^_^
俺的DEMO:下载