銳浪報表加載List泛型數據

個人比較喜歡使用Dapper抓取數據,該ORM抓取到的都是List泛型對象,但銳浪官方的例子都是DataTable加載記錄集,所以我就寫了一個List泛型加載記錄集的方法,供一些和我一樣的小菜參考,有問題可以拍磚,謝謝.

  • List泛型加載銳浪數據集

public class GridReportHelper
    {
        private struct MatchFieldPairType
        {
            public IGRField grField;
            public int MatchColumnIndex;
        }
        //List加載數據集
        public static void FillRecordToReport<T>(IGridppReport Report, List<T> listT)
        {

            Type type = typeof(T);  //反射類型             

            MatchFieldPairType[] MatchFieldPairs = new MatchFieldPairType[Math.Min(Report.DetailGrid.Recordset.Fields.Count, type.GetProperties().Length)];

            //根據字段名稱與列名稱進行匹配,建立DataReader字段與Grid++Report記錄集的字段之間的對應關係
            int MatchFieldCount = 0;
            int i = 0;
            MemberInfo[] members = type.GetMembers();
            foreach (MemberInfo memberInfo in members)
            {
                foreach (IGRField fld in Report.DetailGrid.Recordset.Fields)
                {
                    if (String.Compare(fld.Name, memberInfo.Name, true) == 0)
                    {
                        MatchFieldPairs[MatchFieldCount].grField = fld;
                        MatchFieldPairs[MatchFieldCount].MatchColumnIndex = i;
                        ++MatchFieldCount;
                        break;
                    }
                }
                ++i;
            }

            Helper.StringHelper stringhelper = new StringHelper();      //定義string幫助類
            // 將 DataTable 中的每一條記錄轉儲到 Grid++Report 的數據集中去
            foreach (T t in listT)
            {
                Report.DetailGrid.Recordset.Append();

                for ( i = 0; i < MatchFieldCount; ++i)
                {
                    if (stringhelper.GetValue<T>(t, MatchFieldPairs[i].grField.Name) != null)
                        MatchFieldPairs[i].grField.Value = stringhelper.GetValue<T>(t, MatchFieldPairs[i].grField.Name);
                }

                Report.DetailGrid.Recordset.Post();
            }
        }
        
    }
  • 第一步: 定義Grid++Report報表主對象 

 private GridppReport Report = new GridppReport();
  •  第二步:加載報表模板 

Report.LoadFromFile(inifilehelper.ReadValue("ZSLablePrint", "ReportPath"));
  • 第三步:加載報表事件              

Report.PrintAsDesignPaper = true;       //打印設置與設計頁面一致
//連接報表取數事件
Report.FetchRecord -= new _IGridppReportEvents_FetchRecordEventHandler(ReportFetchRecord);
Report.FetchRecord += new _IGridppReportEvents_FetchRecordEventHandler(ReportFetchRecord);
Report.PrintEnd += new _IGridppReportEvents_PrintEndEventHandler(Report_PrintEnd);

                
Report.Printer.DesignPrinterName = inifilehelper.ReadValue("ZSLablePrint", "PrinterName"); //默認打印機名稱
Report.Printer.PaperName = inifilehelper.ReadValue("ZSLablePrint", "PaperName");

簡要說明: 

FetchRecordEventHandler事件需要先刪除後再加載,是避免數據集重複加載的問題,

PrintEndEventHandler是加載打印後事件,例如打印後記錄打印次數。

  • 第四步: 報表預覽

Report.PrintPreview(true);
  • 附記錄加載方法和打印後事件
/// <summary>
/// 動態加載list
/// </summary>
private void ReportFetchRecord()
{
	List<Model.AL_LablesZS> listlableszs = new List<Model.AL_LablesZS>();       
	Model.AL_LablesZS lableszs = new Model.AL_LablesZS(); //定義標籤對象
	string strSQL = @"SELECT * FROM AL_LablesZS WHERE ID = @ID";
	lableszs = Helper.DapperHelper.GetFirstOrDefault<Model.AL_LablesZS>(strSQL, new { ID = id });

	int x = lableszs.FAuxQty;
	int y = lableszs.PackageQty;
	//判斷打印標籤數量,每次打印最多10張,避免沒有更改每包數量的問題
	if (x/y > 10)
	{
		MessageBox.Show("每次標籤打印數量不能超過10張,煩請確定【每包數量】及【生產數量】");
		return;
	}

	int i = 0;              //定義序號變量
	//添加數據集
	while (x>0)
	{
		i = i + 1;
		Model.AL_LablesZS tmp = new Model.AL_LablesZS(); //定義標籤對象
		tmp = Helper.ObjectHelper.TransReflection<Model.AL_LablesZS, Model.AL_LablesZS>(lableszs);
		tmp.FBatch2 = tmp.FBatch2 + i.ToString();       //生產批號2最後一位序號自動增加.
		tmp.GUID = tmp.ID.ToString() + "-" + (100 + i).ToString() + DateTime.Now.ToString("HHmmssfff") + "-" + tmp.CZFBatchNo;

		if (x>y)     //生產數量大於包裝數量
		{
			listlableszs.Add(tmp);     //添加一個對象
			x = x - y;                      //添加完成後減少該包裝數量
			continue;                       //繼續下一循環
		}
		else
		{
			tmp.PackageQty = x;        //如果不足包裝數量時,則包裝數量等於剩餘數量
			listlableszs.Add(tmp);
			break;                              //退出循環
		}

	}

	//自動填充報表數據集
	Helper.GridReportHelper.FillRecordToReport<Model.AL_LablesZS>(Report, listlableszs);


}
/// <summary>
/// 報表打印結束後事件
/// </summary>
private void Report_PrintEnd()
{         
	Model.AL_LablesZS lableszs = new Model.AL_LablesZS(); //定義標籤對象
	string strSQL = @"UPDATE AL_LablesZS SET PrintUser = @PrintUser,PrintTime = @PrintTime,
								PrintCount = PrintCount + 1 WHERE ID = @ID";
	lableszs.ID = id;       
	lableszs.PrintUser = Helper.DapperHelper.username.UserName;         //當前用戶
	lableszs.PrintTime = DateTime.Now;
	Helper.DapperHelper.ExecuteWithTrans(strSQL, lableszs);

}
#endregion

               

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章