銳浪報表應用系列四(說一說你不一定知道的取值方法)


          首先我們來說下上次說的報表模板中,數據庫表連接串,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();
            }
        }

        這個應該就是我們現在用的,模板只放明細記錄字段,所有的我們都放在了代碼里,想怎么玩就怎么玩。只有你想不到,沒有做不到的。今天就說到這里,以上內容都是對你有幫助的,如果你是初學者,那么這個肯定就是捷徑,如果你是已經在使用的朋友,可以看看是不是跟我的方法一樣呢,不一樣,您會不會也給說出來,我們共同分享,共同學習呢。如果有疑問的地方可以@我,謝謝。

 


免責聲明!

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



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