原創(chuàng)|使用教程|編輯:郝浩|2013-07-18 09:46:03.000|閱讀 346 次
概述:ActiveReports是目前生成和顯示報(bào)表效率最高的報(bào)表控件,但是由于某些報(bào)表長(zhǎng)度非常大,加載還是需要一段時(shí)間,就需要顯示加載進(jìn)度條了。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷(xiāo)售中 >>
報(bào)表控件ActiveReports一直以其能夠更快速的生成報(bào)表為豪,據(jù)GrapeCity內(nèi)部測(cè)試,ActiveReports是目前生成和顯示報(bào)表效率最高的報(bào)表控件,但是由于某些報(bào)表長(zhǎng)度非常大,如果要生成或運(yùn)行非常大的報(bào)表,ActiveReports還是需要一段時(shí)間,這段時(shí)間可能是幾秒,最長(zhǎng)也可能達(dá)到幾十秒,這時(shí)進(jìn)度條的需求就出現(xiàn)了。最終用戶(hù)需要一個(gè)進(jìn)度條來(lái)顯示報(bào)表生成的進(jìn)度,不然最終用戶(hù)可能將正常報(bào)表生成時(shí)間理解為應(yīng)用系統(tǒng)的不穩(wěn)定。
雖然ActiveReports的報(bào)表瀏覽器并沒(méi)有顯示進(jìn)度條的功能,但是ActiveReports驚人的靈活性允許開(kāi)發(fā)者將一個(gè)用戶(hù)顯示報(bào)表生成進(jìn)度的進(jìn)度條集成到報(bào)表瀏覽器中,類(lèi)似一下效果:
我們需要Windows forms ProgressBar 這個(gè)控件,此外還需要一個(gè)標(biāo)簽控件用于顯示進(jìn)度的百分比和提示報(bào)表生成完成。
首先要確定報(bào)表記錄數(shù)來(lái)確定進(jìn)度條的最大值,ActiveReports支持多種類(lèi)型的數(shù)據(jù)源,所以還要確定報(bào)表使用的數(shù)據(jù)源類(lèi)型,下面的代碼示例就是創(chuàng)建一個(gè)GetNoOfRecords函數(shù)來(lái)計(jì)算記錄數(shù),這種方式適用于常見(jiàn)數(shù)據(jù)源。
public int GetNoOfRecords(object ds) { int noOfRecs = 0; if (ds.GetType().ToString() == "GrapeCity.ActiveReports.Data.SqlDBDataSource") { GrapeCity.ActiveReports.Data.SqlDBDataSource ods = (GrapeCity.ActiveReports.Data.SqlDBDataSource)ds; SqlConnection con = new SqlConnection(ods.ConnectionString); SqlCommand com = new SqlCommand("Select count(*) as totalRecs from (" + ods.SQL + ")", con); con.Open(); SqlDataReader sdr = com.ExecuteReader(); sdr.Read(); if (sdr.HasRows) { noOfRecs = Convert.ToInt32(sdr[0]); } con.Close(); } else if (ds.GetType().ToString() == "GrapeCity.ActiveReports.Data.OleDBDataSource") { GrapeCity.ActiveReports.Data.OleDBDataSource ods = (GrapeCity.ActiveReports.Data.OleDBDataSource)ds; OleDbConnection con = new OleDbConnection(ods.ConnectionString); OleDbCommand com = new OleDbCommand("Select count(*) as totalRecs from (" + ods.SQL + ")", con); con.Open(); OleDbDataReader odr = com.ExecuteReader(); odr.Read(); if (odr.HasRows) { noOfRecs = Convert.ToInt32(odr[0]); } con.Close(); } else if (ds.GetType().ToString() == "GrapeCity.ActiveReports.Data.XMLDataSource") { GrapeCity.ActiveReports.Data.XMLDataSource xds = (GrapeCity.ActiveReports.Data.XMLDataSource)ds; noOfRecs = xds.NodeList.Count; } else if (ds.GetType().ToString() == "System.Data.DataTable") { System.Data.DataTable dtds = (System.Data.DataTable)ds; noOfRecs = dtds.Rows.Count; } else { GrapeCity.ActiveReports.Data.ListDataSource lds = (GrapeCity.ActiveReports.Data.ListDataSource)ds; noOfRecs = lds.List.Count; } return noOfRecs; }
在得到記錄數(shù)后,需要將其值設(shè)置為最大進(jìn)度數(shù),并在一個(gè)單獨(dú)的線(xiàn)程中運(yùn)行的ActiveReports。在單獨(dú)進(jìn)程運(yùn)行報(bào)表能夠?qū)崿F(xiàn)報(bào)表的后臺(tái)運(yùn)行而且能獲取報(bào)表進(jìn)度。接下來(lái)定義一個(gè)在FetchData事件中遞增的變量recordCount,這個(gè)變量將用來(lái)控制進(jìn)度條的運(yùn)動(dòng),示例代碼如下所示:
private void CheckProgress(object sender, EventArgs e) { if (progressBar1.Maximum > recordCount) { progressBar1.Value = recordCount; label1.Text = ((int)((progressBar1.Value * 100) / progressBar1.Maximum)).ToString() + "%"; } else { timer1.Enabled = true; label1.Text = "Done!"; progressBar1.Value = progressBar1.Maximum; StopTimer(); } }
以上代碼中的label1是用來(lái)顯示進(jìn)度百分比的。代碼中也包含了停止和重啟報(bào)表生成的按鈕。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:慧都控件網(wǎng)