这次的项目由于涉及到了打印输出,这样也就不得不要涉及一些打印预览功能,本来可以使用CrystalReport,但又通过别人介绍发现了一款制作更加精美,而且实用的FastReport控件,下面把项目中的小应用说道说道。
首先,从官方网站可以下载到FastReport最新版本,安装时注意勾选"将FastReport控件添加到VisualStudio工具箱",安装完成后就可以看到控件列表了:
一、EnvironmentSettings的使用
EnvironmentSettings顾名思义是环境设置,这里可以对其他的几个控件进行样式上的设置,不过个人感觉没啥必要了,因为原本的样式已经足够完美,所以这个直接Pass
二、DesignerControl的使用
DesignerControl是FastReport的主设计界面,拖动控件进入窗体,可以看到基本的效果:
要让工作区能够正常使用,只需在窗体的Load事件中加入以下代码:
![FastReport报表控件的使用 FastReport报表控件的使用](http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
2
3 Reportreport = new Report();
4 designerControl1.Report = report;
5
6 这时打开窗口,可以清晰的看到FastReport的工作区
7 了,但同时还有个问题,就是在视图里面点击数据源、
8 属性等看不到相应的窗口,这时再加一句代码刷新
9 FastReport的工具箱和工具窗口的布局
10
11 designerControl1.RefreshLayout();
12
三、Report的使用
PreviewControl就是预览数据显示效果的控件,不过一般不需要在窗体中拖拽使用,数据的预览需要FastReport的模板支持,FastReport中自带的模板默认都是以Northwind数据库的Employees表作为数据源的,这自然满足不了现实的需求,所以这里需要自己制作相应的模板,
随后可以点击Ctrl+P预览,软件还自带了很多设计的样式,诸如模糊、滤镜、条纹、背景等等,仔细设计一下效果肯定会更好。。。。
将模板保存回到窗体中,后台中编写如下代码:
![FastReport报表控件的使用 FastReport报表控件的使用](http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
{
InitializeComponent();
InitialData();
}
private DataSet ds = null ;
private void InitialData()
{
SqlConnection con = new SqlConnection( " server=.;database=XXX;uid=sa; " );
SqlDataAdapter adapter = new SqlDataAdapter( " select * fromStudent " , 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();
}
主设计器的代码如下:
![FastReport报表控件的使用 FastReport报表控件的使用](http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
{
// 加载工作区
Reportreport = new Report();
designerControl1.Report = report;
designerControl1.RefreshLayout();
// 更改设计器的选择文件对话框和打开报表对话框
Config.DesignerSettings.CustomOpenDialog += new FastReport.Design.
OpenSaveDialogEventHandl
(DesignerSettings_CustomOpenDialog);
Config.DesignerSettings.CustomOpenReport +=
new FastReport.Design.
OpenSaveReportEventHandl
// 更改设计器的保存文件对话框和保存报表对话框
Config.DesignerSettings.CustomSaveDialog += new FastReport.Design..
OpenSaveDialogEventHandl
(DesignerSettings_CustomSaveDialog);
Config.DesignerSettings.CustomSaveReport += new FastReport.Design.
OpenSaveReportEventHandl
// 得到当前模板信息
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 ;
}
}
// 没有检测到同名模板,则向报表数据集中增加一个新行
DataRownewRow = ReportTable.NewRow();
ReportTable.Rows.Add(newRow);
using (MemoryStream stream = new MemoryStream())
{
report.Save(stream);
// 写入xml配置文件
newRow[ " ReportName " ] = reportName;
newRow[ " ReportStream " ] = stream.ToArray();
}
}