如何根據(jù)父報(bào)表的條件顯示子報(bào)表
許多現(xiàn)代的報(bào)表生成器都允許您嵌入另一個(gè)報(bào)表,即所謂的子報(bào)表。為什么要這么做?例如,為了方便設(shè)計(jì)報(bào)表。如果主報(bào)表和子報(bào)表具有不同的類型,則更容易分別創(chuàng)建它們。
此外,通過以這種方式劃分報(bào)表,您可以根據(jù)條件控制報(bào)表的結(jié)構(gòu)。例如,您在主報(bào)表中顯示了一些基本信息,但是根據(jù)該數(shù)據(jù)或報(bào)表中的某些參數(shù),將選擇多個(gè)子報(bào)表之一。這使您的報(bào)表更具通用性。無需在不同情況下創(chuàng)建多個(gè)報(bào)表。
ActiveReports報(bào)表生成器的用戶對(duì)此問題感到困惑:
我有一個(gè)包含兩個(gè)子報(bào)表的報(bào)表。我想根據(jù)條件運(yùn)行或不運(yùn)行每個(gè)子報(bào)表。這可能嗎?
技術(shù)支持回復(fù):
是的,可以根據(jù)某些條件從父報(bào)表中選擇子報(bào)表。例如,您可以在Detail的Format Event中使用SubReport控件的Visible屬性,基于每次觸發(fā)Detail.OnFormat事件時(shí)都會(huì)增加的計(jì)數(shù)器變量來控制子報(bào)表的可見性。
在FastReport.Net中,子報(bào)表僅在另一頁上創(chuàng)建,并且可以訪問與主報(bào)表相同的數(shù)據(jù)。主報(bào)表將一個(gè)子報(bào)表對(duì)象添加到您計(jì)劃放置該子報(bào)表的位置。該對(duì)象是將立即創(chuàng)建的報(bào)表頁面的鏈接。作為新報(bào)表頁面的一部分,您可以創(chuàng)建所需的模式。
順便說一句,您可以先創(chuàng)建一個(gè)包含多個(gè)頁面的報(bào)表,然后,如果需要,可以添加一個(gè)子報(bào)表對(duì)象,并將其放在其屬性中,以鏈接到所需頁面。
讓我們看一下如何根據(jù)條件制作帶有子報(bào)表的報(bào)表。實(shí)際上,這個(gè)想法很簡單。由于報(bào)表中包含腳本,因此我們將提供所需子報(bào)表的可見性。在這種情況下,子報(bào)表應(yīng)放在同一位置,一個(gè)對(duì)象放在另一個(gè)對(duì)象上。
假設(shè)我們的報(bào)表顯示了訂單信息。還有一些與訂單表相關(guān)的報(bào)表:訂單詳細(xì)信息、產(chǎn)品、客戶。除了訂單信息外,我們還要列出訂單中的產(chǎn)品或客戶信息。該報(bào)表具有一個(gè)參數(shù),基于該參數(shù)我們將顯示產(chǎn)品列表或客戶信息。
主報(bào)表的模板非常簡單:
有關(guān)訂單的基本信息來自“Orders”訂單表。在添加的字段旁邊,我們有一個(gè)Subreport對(duì)象。在Subreport1屬性中,您絕對(duì)應(yīng)該將PrintOnParent屬性設(shè)置為true。
當(dāng)我們添加子報(bào)表對(duì)象時(shí),會(huì)自動(dòng)添加一個(gè)新的報(bào)表頁面。在此頁面上,我們創(chuàng)建一個(gè)子報(bào)表模板,該模板將顯示產(chǎn)品列表。由于“Orders”訂單表與“Order Details”訂單明細(xì)相關(guān)聯(lián),因此該報(bào)表將顯示與當(dāng)前訂單相對(duì)應(yīng)的記錄。訂單明細(xì)表還具有與產(chǎn)品表的連接。我們將使用來自此連接的數(shù)據(jù):
這就是為什么到字段的鏈接具有這樣的視圖的原因:Order Details.Products.ProductName。
現(xiàn)在,再添加一個(gè)子報(bào)表對(duì)象。將其放在Subreport1上。您還需要將PrintOnParent屬性設(shè)置為true。
在第二個(gè)子報(bào)表模板中,我們從“Customers”客戶表中添加一個(gè)與“Orders”訂單表有聯(lián)系的字段。
現(xiàn)在,我們有了一個(gè)包含兩個(gè)子報(bào)表的報(bào)表。添加報(bào)表參數(shù)??梢詮膱?bào)表外部(例如,從用戶程序)設(shè)置參數(shù)。
對(duì)于主報(bào)表中的Data band,創(chuàng)建一個(gè)處理程序BeforePrint事件:
private void Data1_BeforePrint(object sender, EventArgs e) { if ((int)Report.GetParameterValue("Parameter") == 1) { Subreport1.Visible = false; Subreport2.Visible = true; } else { Subreport1.Visible = true; Subreport2.Visible = false; } }
代碼很簡單,因此實(shí)際上基本的編程技能足以創(chuàng)建此類報(bào)表。
結(jié)果,產(chǎn)品列表將如下所示:
客戶信息表將如下所示:
產(chǎn)品介紹 | 下載試用 | 優(yōu)惠活動(dòng) | 在線客服