首先我們來說下上次說的報表模板中,數據庫表連接串,sql語句,這個可以直接取到數據然后展示,那么我們可以更近一步呢,這個報表的內容是不確定的,比如說我們打印的出庫入庫單據等,對吧。這里簡單的就是一個參數傳值,我們在報表模板里面定義一個參數,然后在sql語句中引用這個參數,最后就是我們在程序里面把我們要的值傳給這個參數。這是最簡單的一種傳值方法,相信初學者開始肯定都是這么干的。
private void btnDaYin_Click(object sender, EventArgs e) { a(); FrmCaiGouRuKuPreview frm = new FrmCaiGouRuKuPreview(); frm.AttachReport(Report); frm.ShowDialog(); } public void a() { //從對應文件中載入報表模板數據 if (this.UserInfo.DepartmentName == "a") { Report.LoadFromFile(BaseBaoBiao.GetReportTemplatePath() + "a.grf"); } else if (this.UserInfo.DepartmentName == "b") { Report.LoadFromFile(BaseBaoBiao.GetReportTemplatePath() + "b.grf"); } Report.Initialize += new _IGridppReportEvents_InitializeEventHandler(ReportInitialize); //設置與數據源的連接串,因為在設計時指定的數據庫路徑是絕對路徑。 if (Report.DetailGrid != null) Report.DetailGrid.Recordset.ConnectionString = BaseBaoBiao.GetDatabaseConnectionString(); } private void ReportInitialize() { //傳遞參數 Report.ParameterByName("YuanName").AsString = this.UserInfo.CompanyName; Report.ParameterByName("KeShiName").AsString = this.UserInfo.DepartmentName; Report.ParameterByName("RuKuFangShi").AsString = "采購入庫"; Report.ParameterByName("RuKuDanHao").AsString = EntityId; DateTime riqi = Convert.ToDateTime(grvHead.GetFocusedRowCellValue("CreateOn")); Report.ParameterByName("CaiGouRiQi").AsString = riqi.ToString("yyyy年MM月dd日"); Report.ParameterByName("Id").AsString = grvHead.GetFocusedRowCellValue("Id").ToString(); string keshiname = grvHead.GetFocusedRowCellValue("SuoShuLeiBieName").ToString(); //keshiname=keshiname.Remove(0,3); Report.ParameterByName("FenLei").AsString = keshiname; Report.ParameterByName("GongHuoShang").AsString = grvHead.GetFocusedRowCellValue("GongYingShang").ToString(); }
看上面代碼,這是我剛開始用的時候自己寫的例子,注意其中a方法,加載數據庫連接語句和參數。ReportInitialize方法是獲取參數。這里獲取到之后報表模板里面sql語句where條件 例如:Code=:RuKuDanHao,這個就是在報表模板里面的寫法。簡單的開始學習了,我們也知道了,那么當我們遇到傳值的時候不是一個字符串或者數字呢,這些麻煩來了,因為如果我們傳一個類似1,2,3,4,5 這種參數或者'a','b','c','d'這樣的參數呢,這個方法就行不通了,怎么辦呢。別着急,它既然科傳參數,那么是不是也可以傳數據集呢,呵呵,當我順着這條思路去做的時候,結果告訴我,是可以的。那么怎么來實現呢。直接貼代碼好了,各位看官看好了。
protected GridppReport Report = new GridppReport(); --這個是必須new的
DataTable dtReport = new DataTable();--這個呢,注意下面就是重點了,上面我們不是已經說好了,我們直接傳數據集嗎?
-------此處省略dtReport數據集獲取
new Reports() .FillRecordToReport(Report, dtReport);--這樣我們就把數據集賦值給了報表明細列表。然后我們就可以打開報表展示數據了。
這里有人會問,FillRecordToReport方法怎么寫呢。別着急,后面貼上。
// 將 DataTable 的數據轉儲到 Grid++Report 的數據集中 public static void FillRecordToReport(IGridppReport Report, DataTable dt) { MatchFieldPairType[] MatchFieldPairs = new MatchFieldPairType[Math.Min(Report.DetailGrid.Recordset.Fields.Count, dt.Columns.Count)]; //根據字段名稱與列名稱進行匹配,建立DataReader字段與Grid++Report記錄集的字段之間的對應關系 int MatchFieldCount = 0; for (int i = 0; i < dt.Columns.Count; ++i) { foreach (IGRField fld in Report.DetailGrid.Recordset.Fields) { if (String.Compare(fld.Name, dt.Columns[i].ColumnName, true) == 0) { MatchFieldPairs[MatchFieldCount].grField = fld; MatchFieldPairs[MatchFieldCount].MatchColumnIndex = i; ++MatchFieldCount; break; } } }
各位看官可以慢慢看哦,這里既然貼出了直接傳入數據集那么肯定還會有其他的方法。下面我再貼一段。用法類似,大家可以試試的。
// 將 DataReader 的數據轉儲到 Grid++Report 的數據集中 public static void FillRecordToReport(IGridppReport Report, IDataReader dr) { MatchFieldPairType[] MatchFieldPairs = new MatchFieldPairType[Math.Min(Report.DetailGrid.Recordset.Fields.Count, dr.FieldCount)]; //根據字段名稱與列名稱進行匹配,建立DataReader字段與Grid++Report記錄集的字段之間的對應關系 int MatchFieldCount = 0; for (int i = 0; i < dr.FieldCount; ++i) { foreach (IGRField fld in Report.DetailGrid.Recordset.Fields) { if (String.Compare(fld.RunningDBField, dr.GetName(i), true) == 0) { MatchFieldPairs[MatchFieldCount].grField = fld; MatchFieldPairs[MatchFieldCount].MatchColumnIndex = i; ++MatchFieldCount; break; } } } // Loop through the contents of the OleDbDataReader object. // 將 DataReader 中的每一條記錄轉儲到Grid++Report 的數據集中去 while (dr.Read()) { Report.DetailGrid.Recordset.Append(); for (int i = 0; i < MatchFieldCount; ++i) { if (!dr.IsDBNull(MatchFieldPairs[i].MatchColumnIndex)) MatchFieldPairs[i].grField.Value = dr.GetValue(MatchFieldPairs[i].MatchColumnIndex); } Report.DetailGrid.Recordset.Post(); } }
這個應該就是我們現在用的,模板只放明細記錄字段,所有的我們都放在了代碼里,想怎么玩就怎么玩。只有你想不到,沒有做不到的。今天就說到這里,以上內容都是對你有幫助的,如果你是初學者,那么這個肯定就是捷徑,如果你是已經在使用的朋友,可以看看是不是跟我的方法一樣呢,不一樣,您會不會也給說出來,我們共同分享,共同學習呢。如果有疑問的地方可以@我,謝謝。