轉自小黑的博客數據庫
此次的項目因爲涉及到了打印輸出,這樣也就不得不要涉及一些打印預覽功能,原本可使用Crystal Report,但又經過別人介紹發現了一款製做更加精美,並且實用的FastReport控件,下面把項目中的小應用說道說道。工具
首先,從官方網站能夠下載到FastReport最新版本,安裝時注意勾選"將FastReport控件添加到Visual Studio工具箱",安裝完成後就能夠看到控件列表了:佈局
1、EnvironmentSettings的使用網站
EnvironmentSettings顧名思義是環境設置,這裏能夠對其餘的幾個控件進行樣式上的設置,不過我的感受沒啥必要了,由於本來的樣式已經足夠完美,因此這個直接Passui
2、DesignerControl的使用this
DesignerControl是FastReport的主設計界面,拖動控件進入窗體,能夠看到基本的效果:spa
要讓工做區可以正常使用,只需在窗體的Load事件中加入如下代碼: 設計
代碼
1 //加載時新建一個報表,把他附加到設計器上
2
3 Report report = new Report();
4 designerControl1.Report = report;
5
6 這時打開窗口,能夠清晰的看到FastReport的工做區
7 了,但同時還有個問題,就是在視圖裏麪點擊數據源、
8 屬性等看不到相應的窗口,這時再加一句代碼刷新
9 FastReport的工具箱和工具窗口的佈局
10
11 designerControl1.RefreshLayout();
12
3、Report的使用3d
PreviewControl就是預覽數據顯示效果的控件,不過通常不須要在窗體中拖拽使用,數據的預覽須要FastReport的模板支持,FastReport中自帶的模板默認都是以Northwind數據庫的Employees表做爲數據源的,這天然知足不了現實的需求,因此這裏須要本身製做相應的模板, 首先進入數據菜單,選擇添加數據源,加入本身須要顯示的數據表,隨後將其拖拽至設計界面的數據區,以常見的學生表爲例,設計界面下的效果大體以下:code
隨後能夠點擊Ctrl+P預覽,軟件還自帶了不少設計的樣式,諸如模糊、濾鏡、條紋、背景等等,仔細設計一下效果確定會更好。。。。
將模板保存回到窗體中,後臺中編寫以下代碼:
代碼
public Form1()
{
InitializeComponent();
InitialData();
}
private DataSet ds = null;
private void InitialData()
{
SqlConnection con = new SqlConnection("server=.;database=XXX;uid=sa;");
SqlDataAdapter adapter = new SqlDataAdapter("select * from Student", 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();
}
使用仍是比較方便。。。。不過每次都要這樣加載,貌似有些麻煩,咱們能夠將他以流的形式存儲在一個XML文件中,從而方便訪問。
主設計器的代碼以下:
代碼
private void Form1_Load(object sender, EventArgs e)
{
//加載工做區
Report report = new Report();
designerControl1.Report = report;
designerControl1.RefreshLayout();
//更改設計器的選擇文件對話框和打開報表對話框
Config.DesignerSettings.CustomOpenDialog += new FastReport.Design.
OpenSaveDialogEventHandler
(DesignerSettings_CustomOpenDialog);
Config.DesignerSettings.CustomOpenReport +=
new FastReport.Design.
OpenSaveReportEventHandler(DesignerSettings_CustomOpenReport);
//更改設計器的保存文件對話框和保存報表對話框
Config.DesignerSettings.CustomSaveDialog += new FastReport.Design..
OpenSaveDialogEventHandler
(DesignerSettings_CustomSaveDialog);
Config.DesignerSettings.CustomSaveReport += new FastReport.Design.
OpenSaveReportEventHandler(DesignerSettings_CustomSaveReport);
//獲得當前模板信息
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;
}
}
//沒有檢測到同名模板,則向報表數據集中增長一個新行
DataRow newRow = ReportTable.NewRow();
ReportTable.Rows.Add(newRow);
using (MemoryStream stream = new MemoryStream())
{
report.Save(stream);
//寫入xml配置文件
newRow["ReportName"] = reportName;
newRow["ReportStream"] = stream.ToArray();
}
}
打開和保存模板的代碼見DEMO,其實這些代碼參照示例寫出來的,你們能夠去仔細研究下安裝目錄下的全部示例,俺這裏仍是要切合這個系列的主題嘛,作事有時仍是要就事論事的,有時沒有必要徹底搞定全部的功能,先把須要實現的實現了再說^_^
俺的DEMO: 下載