如何實(shí)現(xiàn)報(bào)表中高亮顯示文本功能
在瀏覽電子報(bào)表時(shí),你常常會(huì)想要高亮顯示一些文本,就像你在閱讀紙質(zhì)文檔時(shí)用熒光筆勾畫重點(diǎn)那樣。我要告訴你,這是可以實(shí)現(xiàn)的。
在報(bào)表預(yù)覽模式下,你可以通過(guò)單擊鼠標(biāo)來(lái)選擇所需的文本字段。也就是說(shuō),你單擊文本框,它就會(huì)改變顏色。如果再次按下,突出顯示效果消失。我會(huì)告訴你兩種方法來(lái)做到這一點(diǎn),他們都涉及使用報(bào)表腳本。
方法1:該方法的本質(zhì)是使用一個(gè)Sender(即引發(fā)事件的對(duì)象)來(lái)分配一個(gè)新的顏色給OnCklick事件處理句柄。在這種情況下,你需要更新緩存中的報(bào)表頁(yè)面,因?yàn)?nbsp;因?yàn)轭A(yù)覽模式會(huì)顯示其報(bào)表。
那么,讓我們用產(chǎn)品清單創(chuàng)建一個(gè)最簡(jiǎn)單的報(bào)表:
假設(shè)我們想通過(guò)點(diǎn)擊來(lái)突出顯示其中的一個(gè)字段。而當(dāng)我們?cè)俅吸c(diǎn)擊時(shí),我們想刪除高亮顯示。為文本對(duì)象創(chuàng)建事件“點(diǎn)擊”,以顯示Products.ProductName字段。
private void Text1_Click(object sender, EventArgs e) { if (sender is TextObject) { //Define sender as TextObject TextObject obj = sender as TextObject; //Method of highlighting an object SwitchColor(obj); if(Report.Preview != null) { // Refresh the current page of the report in the cache, if the report is viewed on a desktop Report.PreparedPages.ModifyPage(Report.Preview.PageNo - 1, obj.Page as ReportPage); //Refresh preview Report.Preview.Refresh(); } } } private void SwitchColor(TextObject obj) { // Check whether the object is filled with yellow if (obj.Fill is SolidFill && (obj.Fill as SolidFill).Color != Color.Yellow) //Fill with yellow obj.Fill = new SolidFill(Color.Yellow); // Clear the fill else obj.Fill = new SolidFill(Color.Transparent); }
如你所見(jiàn),我們從點(diǎn)擊事件中提取Sender對(duì)象,將其定義為文本對(duì)象并更改其填充。然后,重新繪制緩存中的報(bào)表頁(yè)面。如果我們有一個(gè)web報(bào)表,我們只需更改對(duì)象的填充,而無(wú)需重新繪制報(bào)表頁(yè)面。
我們?cè)倏紤]下另一種替代方法。
方法2:這種方法的本質(zhì)是確定對(duì)象的坐標(biāo),我們將用顏色填充。然后我們更新緩存中的報(bào)表頁(yè)面,就像第一個(gè)方法一樣。
private void Text1_Click(object sender, EventArgs e) { if (sender is TextObject) { // Get the current page number int pageNo = Report.Preview.PageNo - 1; // Get the page by number ReportPage page = Report.PreparedPages.GetPage(pageNo); // Define sender as TextObject - this phantom object, we also need the original object from the preview page TextObject obj = sender as TextObject; // Looking the original object on the preview page foreach(ReportComponentBase b in page.AllObjects) // It is necessary to identify the object by name and coordinates if (b.Name == obj.Name && b.AbsTop == obj.AbsTop && b.AbsLeft == obj.AbsLeft) { // Get the original object obj = b as TextObject; break; } // Defining the object's fill if (obj.Fill is SolidFill && (obj.Fill as SolidFill).Color != Color.Yellow) obj.Fill = new SolidFill(Color.Yellow); else obj.Fill = new SolidFill(Color.Transparent); // Update the report page in the cache Report.PreparedPages.ModifyPage(pageNo, page); // Refresh prewiew Report.Preview.Refresh(); } }
我們來(lái)演示一下這個(gè)代碼的操作:
這種方法客觀上比較復(fù)雜,只適用于預(yù)覽模式。但是,它有它的優(yōu)點(diǎn)。假設(shè)你不僅要突出顯示你單擊的文本對(duì)象,還要突出顯示表中的整個(gè)行。然后添加另一個(gè)文本對(duì)象,使其與我們將單擊的對(duì)象重疊。我們拉伸它的整個(gè)寬度。文本對(duì)象的左邊界與文本對(duì)象的左邊界重合,為此我們創(chuàng)建了一個(gè)點(diǎn)擊事件,這一點(diǎn)很重要。右鍵單擊,并從菜單中選擇:
就這樣,我們將這個(gè)對(duì)象移動(dòng)到背景,以便它不與其他文本字段重疊。
修改一下我們以前的代碼:
if (b.AbsTop == obj.AbsTop && b.AbsLeft == obj.AbsLeft) { // Get the original object obj = b as TextObject; break; }
我從條件中刪除了名稱的比較,只留下了字段開(kāi)始坐標(biāo)的比較?,F(xiàn)在運(yùn)行報(bào)表并點(diǎn)擊產(chǎn)品名稱:
如上所示,這兩種方法都是可行的。第一種方法比較簡(jiǎn)單,但是只允許你選擇Sender中的特定對(duì)象。第二個(gè)更復(fù)雜,但它可以讓你突出Sender之外的的對(duì)象。你只需要指定他們的坐標(biāo)。在web報(bào)表中,你只能使用第一種方法。
當(dāng)然,你不僅可以更改背景顏色,還可以更改文本本身的顏色、樣式或字體。另外,當(dāng)以任何支持的格式(例如PDF)導(dǎo)出報(bào)表時(shí),所有這些修改都會(huì)被保留。
產(chǎn)品介紹 | 下載試用 | 優(yōu)惠活動(dòng) | 在線客服 | 聯(lián)系Elyn
推薦閱讀
- FastReport VCL報(bào)表控件開(kāi)發(fā)者手冊(cè)
- FastReport Online Designer中文手冊(cè)
- Fastreport.Net教程2016
- Fastreport.Net用戶手冊(cè)
- FastReport.Net教程2017(持續(xù)更新中···)
- FastReport Online Designer教程2017(持續(xù)更新中···)
- 報(bào)表教程2017(持續(xù)更新中···)
- FastReport.Net v2018.1版本更新已經(jīng)發(fā)布!