• <menu id="w2i4a"></menu>
  • logo FastReport.Net教程2019

    文檔首頁(yè)>>FastReport.Net教程2019>>如何在報(bào)表中使用多級(jí)JSON

    如何在報(bào)表中使用多級(jí)JSON


    盡管FastReport.Net為我們提供了一個(gè)插件供報(bào)表設(shè)計(jì)者用作JSON文件的數(shù)據(jù)源,但它也并不是對(duì)所有人都合適的。此插件適用于表示單獨(dú)表的單級(jí)數(shù)據(jù)。如果數(shù)據(jù)具有多個(gè)嵌套級(jí)別,則必須嘗試其他解決方案。

    例如,使用Newtonsoft.Json庫(kù)——在它的幫助下,您可以從JSON獲取數(shù)據(jù),從中創(chuàng)建列表并在代碼報(bào)告中注冊(cè)它。

    讓我們來(lái)看一個(gè)例子。我們要?jiǎng)?chuàng)建一個(gè)WinForms應(yīng)用程序。在NuGet Manager的幫助下,安裝Newtonsoft.Json包。在參考“Reference”中,添加指向庫(kù)FastReport.dll的鏈接。

    假設(shè)我們有商店經(jīng)營(yíng)的銷售數(shù)據(jù)。所有這些數(shù)據(jù)都在一個(gè)文件中,但事實(shí)上它們是三個(gè)不同的實(shí)體:商店,店長(zhǎng),導(dǎo)購(gòu)。這將是我們這個(gè)例子的json文件:

    {
     "Shops": [{
     "Name": "First shop",
     "Managers": [{
     "Name": "John",
     "Phone": "45443446343",
     "Sales": [{
     "GoodId": "1",
     "Amount": "3"
     },
     {
     "GoodId": "2",
     "Amount": "5"
     },
     {
     "GoodId": "3",
     "Amount": "2"
     }
     ]
     },
     {
     "Name": "Boris",
     "Phone": "8787964387",
     "Sales": [{
     "GoodId": "15",
     "Amount": "8"
     },
     {
     "GoodId": "12",
     "Amount": "2"
     },
     {
     "GoodId": "13",
     "Amount": "2"
     }
     ]
     }
     ]
     },
     {
     "Name": "Second shop",
     "Managers": [{
     "Name": "Julia",
     "Phone": "5555555555",
     "Sales": [{
     "GoodId": "1",
     "Amount": "30"
     }]
     },
     {
     "Name": "Helen",
     "Phone": "8787964387",
     "Sales": [{
     "GoodId": "2",
     "Amount": "8"
     },
     {
     "GoodId": "3",
     "Amount": "26"
     },
     {
     "GoodId": "1",
     "Amount": "2"
     }
     ]
     }
     ]
     }
     ]
    }

    要反序列化此數(shù)據(jù),我們需要具有與JSON中的字段對(duì)應(yīng)的屬性對(duì)象。

    當(dāng)然,如果JSON文檔具有非常深的嵌套,那么它可能會(huì)非常累人。因此,這里有一個(gè)優(yōu)秀的Web服務(wù)http://json2csharp.com/。您只需將有效的json放在輸入字段中,按“Generate”按鈕,然后獲取現(xiàn)成的C#類。對(duì)于我們的json文檔,將生成以下一組類:

    public class Sale
     {
     public string GoodId { get; set; }
     public string Amount { get; set; }
     }
     
     public class Manager
     {
     public string Name { get; set; }
     public string Phone { get; set; }
     public List<Sale> Sales { get; set; }
     }
     
     public class Shop
     {
     public string Name { get; set; }
     public List<Manager> Managers { get; set; }
     }
     
     public class RootObject
     {
     public List<Shop> Shops { get; set; }
     }

    讓我們?yōu)樗鼈儎?chuàng)建一個(gè)單獨(dú)的Sales.cs文件。

    在表單中添加一個(gè)按鈕。對(duì)于click事件,我們將創(chuàng)建一個(gè)處理程序:

    private void RunBtn_Click(object sender, EventArgs e)
     {
     var json = JsonConvert.DeserializeObject<RootObject>(File.ReadAllText(@"Sales.json"));
     Report report = new Report();
     report.RegisterData(json.Shops,"Shops");
     report.Design(); 
     }

    如您所見,這里我們使用Newtonsoft.json庫(kù)將json反序列化為RootObject,它具有屬性Shops,這是一個(gè)商店列表。我們?cè)趫?bào)告中將此列表注冊(cè)為數(shù)據(jù)源。并啟用報(bào)表設(shè)計(jì)器“report designer”。使用單個(gè)按鈕運(yùn)行我們的應(yīng)用程序并單擊它。此時(shí)報(bào)表設(shè)計(jì)器顯示空白報(bào)表。選擇報(bào)告數(shù)據(jù)源:

    MLevelJSON1.png

    根據(jù)此數(shù)據(jù),創(chuàng)建報(bào)告模板:

    MLevelJSON2.png

    如您所見,數(shù)據(jù)表“Data band”有一個(gè)子表,而該子表又有一個(gè)子數(shù)據(jù)表。

    這些數(shù)據(jù)表上的數(shù)據(jù)根據(jù)數(shù)據(jù)源中的層次結(jié)構(gòu)排列。運(yùn)行報(bào)表:

    MLevelJSON3.png


    這樣,我們?cè)贛aster-Detail報(bào)告中就獲得了相關(guān)數(shù)據(jù)。我們不需要在表之間創(chuàng)建特殊關(guān)系來(lái)獲取依賴關(guān)系。在JSON中大量嵌套數(shù)據(jù)的情況下,最好使用我們以上考慮的方法。




    產(chǎn)品介紹 | 下載試用 | 優(yōu)惠活動(dòng) | 在線客服 | 聯(lián)系Elyn

    掃碼咨詢


    添加微信 立即咨詢

    電話咨詢

    客服熱線
    023-68661681

    TOP
    三级成人熟女影院,欧美午夜成人精品视频,亚洲国产成人乱色在线观看,色中色成人论坛 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();