一:水晶報表的安裝
a,下載: http://downloads.businessobjects.com/akdlm/cr4vs2010/CRforVS_13_0_1.exe
b,安裝,很簡單,基本就是“下一步”到頭,這里不再介紹。
二:如何在vs2010里使用
a,運行環境不能為.NET FRAMEWORK 4.0 CLINET PROFILE,要改為.NET FRAMEWORK 4,選中項目右鍵屬性就可以更改了
b,在項目中加一個APP.CONFIG(這是針對WINFORM項目),如果是WEB項目就不用加了,里面有一個WEB.CONFIG;在這配
置文件中加上 <startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>
這可以避免ADO.NET與水晶報表運行時由於.NET版本問題出錯,如圖:
c,下面就是新建一個水晶報表了,新建一個水晶報表.rpt,右擊 解決方案的報表文件夾 CR -> 添加-> 新建項
從左側“已安裝的模板”列表中選 “Reporting”,右側列表中選 “Crystal Reports”
在下側 “名稱”處 輸入希望的名稱,比如: CrystalReport.rpt, 按“添加”進入。如圖:
d,新建一個用放置報表的顯示控件的框體.cs,拖放一個crystalReportViewer,如圖:
e,設計水晶報表.rpt,右鍵單擊數據字段,新建字段,找到數據源的字段,(當然可以為水晶報表新建一個專用的類,用於水晶報表.rpt的數據設計操作)如圖加入字段,然后就是拖放新建的字段到水晶報表.rpt,在其他字段里新建其他需要的字段,並拖放到需要的位置。
三:實例截圖
四:PrintSalarySheet.cs
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using HRMSys.DAL; using HRMSys.Model; namespace HYMSys.UI.EmployeeMgr { public partial class PrintSalarySheet : Form { public PrintSalarySheet() { InitializeComponent(); } /// <summary> /// 窗口自動載入事件,載入部門 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void PrintSalarySheet_Load(object sender, EventArgs e) { DepartmentDAL dal = new DepartmentDAL(); cb_depart.DataSource= dal.ListAll(); cb_depart.DisplayMember = "Name"; //cb_depart.SelectedValue = "Id";//這里應該寫 cb_depart.ValueMember = "Id",SelectedValue現在為空,因為就沒有選擇 cb_depart.ValueMember = "Id"; } /// <summary> /// 搜索某年某月的工資表 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_search_Click(object sender, EventArgs e) { //取得文本框里的值 int year = Convert.ToInt32( tb_year.Text); int month = Convert.ToInt32(tb_month.Text); Guid id = (Guid)cb_depart.SelectedValue; //判斷是否已經生成工資表 SalarySheetDAL sheetDAL = new SalarySheetDAL(); if (sheetDAL.IsExists(year, month, id) == false) { MessageBox.Show("還未生成工資!"); return; } //得到員工的工資表,將信息轉換位水晶報表的字段 Guid sheetId = sheetDAL.GetYearMonthDepartSheetId(year, month, id); SalarySheetItemList[] items = sheetDAL.GetSalaryItems(sheetId); //聲明一個水晶報表的顯示字段 SalarySheetItemRpt[] rptItems = new SalarySheetItemRpt[items.Length]; for (int i = 0; i < items.Length; i++) { SalarySheetItemList item = items[i]; SalarySheetItemRpt rptItem = new SalarySheetItemRpt(); rptItem.BaseSalary = item.BaseSalary; rptItem.Bonus = item.Bonus; rptItem.Fine = item.Fine; rptItem.Other = item.Other; //select emp.Name join T_employee rptItem.EmployeeName = item.EmployeeName; rptItems[i] = rptItem; } //聲明一個水晶報表類 SalarySheetReport report = new SalarySheetReport(); report.SetDataSource(rptItems); report.SetParameterValue("年", year); report.SetParameterValue("月", month); report.SetParameterValue("部門名稱", cb_depart.SelectedText); crystalReportViewer1.ReportSource = report; } } }
五:SalarySheetItemRpt.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace HYMSys.UI.EmployeeMgr { public class SalarySheetItemRpt { public decimal Bonus { get; set; } public decimal BaseSalary { get; set; } public decimal Fine { get; set; } public decimal Other { get; set; } public string EmployeeName { get; set; } } }
六:App.config
<?xml version="1.0"?> <configuration> <connectionStrings> <add name="constr" connectionString="server=.;database=HRMSysDB1;uid=sa;pwd=123123"/> </connectionStrings> <appSettings> <add key="PasswodSalt" value="Love@.>1"/> </appSettings> <startup useLegacyV2RuntimeActivationPolicy="true"><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
七:其中的報錯處理
解決,將承載進程去到
八:總結
今天為止我的小的人事管理系統就完成了,經歷了將近兩個多月的時間,太不容易了,特別對於我這種菜鳥來說,這個是仿照一個WPF的小項目做的winform程序,做到這里我感覺自己有太多太多的知識不是理解的很透徹,唯有“紙上得來終覺淺,絕知此事要躬行”這樣才能學好編程!在這里希望開發界的前輩多來來吐槽、批評和指導。-------紅馬車