FastReport報表控件的使用


轉自小黑的博客

這次的項目由於涉及到了打印輸出,這樣也就不得不要涉及一些打印預覽功能,本來可以使用Crystal Report,但又通過別人介紹發現了一款制作更加精美,而且實用的FastReport控件,下面把項目中的小應用說道說道。

  首先,從官方網站可以下載到FastReport最新版本,安裝時注意勾選"將FastReport控件添加到Visual Studio工具箱",安裝完成后就可以看到控件列表了:

  FastReport報表控件的使用

  

  一、EnvironmentSettings的使用

  EnvironmentSettings顧名思義是環境設置,這里可以對其他的幾個控件進行樣式上的設置,不過個人感覺沒啥必要了,因為原本的樣式已經足夠完美,所以這個直接Pass

  FastReport報表控件的使用

  二、DesignerControl的使用

  DesignerControl是FastReport的主設計界面,拖動控件進入窗體,可以看到基本的效果:

  FastReport報表控件的使用

  

  要讓工作區能夠正常使用,只需在窗體的Load事件中加入以下代碼:   

FastReport報表控件的使用代碼
1 //加載時新建一個報表,把他附加到設計器上
2  
3 Report report = new Report();
4 designerControl1.Report = report;

6 這時打開窗口,可以清晰的看到FastReport的工作區
7 了,但同時還有個問題,就是在視圖里面點擊數據源、
8 屬性等看不到相應的窗口,這時再加一句代碼刷新
9 FastReport的工具箱和工具窗口的布局
10 
11 designerControl1.RefreshLayout();
12  

  三、Report的使用

  PreviewControl就是預覽數據顯示效果的控件,不過一般不需要在窗體中拖拽使用,數據的預覽需要FastReport的模板支持,FastReport中自帶的模板默認都是以Northwind數據庫的Employees表作為數據源的,這自然滿足不了現實的需求,所以這里需要自己制作相應的模板, 首先進入數據菜單,選擇添加數據源,加入自己需要顯示的數據表,隨后將其拖拽至設計界面的數據區,以常見的學生表為例,設計界面下的效果大致如下:

  FastReport報表控件的使用

  隨后可以點擊Ctrl+P預覽,軟件還自帶了很多設計的樣式,諸如模糊、濾鏡、條紋、背景等等,仔細設計一下效果肯定會更好。。。。

  

  將模板保存回到窗體中,后台中編寫如下代碼:

  

FastReport報表控件的使用代碼
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文件中,從而方便訪問。

  主設計器的代碼如下:

  

FastReport報表控件的使用代碼
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: 下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM