2014-09-23 68 views
0

目標:使用kendo ui圖表組件繪製部門以投影工作流程 工作流程結構如下: 每個部門可能有多個策略,每個策略可能有多個程序,每個程序可能有多個項目。Kendo Diagram Datasource - json

我有一個WCF服務,當被調用時返回一個JSON字符串。 該服務調用一個存儲過程返回XML,在vb.net然後我將該XML轉換爲json(使用json.net)。

服務代碼:

Public Function GetStakeholderRelationshipMatrix(StakeholderId As Integer) As String 
    Try 
     conn.Open() 

     Dim da = New SqlDataAdapter() 
     sCommand = New SqlCommand("uspGetRelationshipMatrix", conn) 
     sCommand.CommandType = CommandType.StoredProcedure 
     sCommand.Parameters.AddWithValue("@StakeholderId", StakeholderId) 
     xmlDoc.LoadXml(sCommand.ExecuteScalar()) 
     Return JsonConvert.SerializeXmlNode(xmlDoc) 
    Catch ex As Exception 
     Return -1 
    End Try 
End Function 

XML數據

<Departments> 
 
    <Department Id="7" Name="Information Technology Department"> 
 
    <Strategies Id="21" Name="Increase Revenue"> 
 
     <Programs Id="45" Name="Program1"> 
 
     <Projects Id="4" Name="test3" /> 
 
     </Programs> 
 
     <Programs Id="49" Name="Program4"> 
 
     <Projects Id="2" Name="Test1" /> 
 
     <Projects Id="3" Name="Test2" /> 
 
     </Programs> 
 
    </Strategies> 
 
    </Department> 
 
</Departments>

Json的轉換數據:

{"d":"{\"Departments\":{\"Department\":{\"@Id\":\"7\",\"@Name\":\"Information Technology Department\",\"Strategies\":{\"@Id\":\"21\",\"@Name\":\"Increase Revenue\",\"Programs\":[{\"@Id\":\"45\",\"@Name\":\"Program1\",\"Projects\":{\"@Id\":\"4\",\"@Name\":\"test3\"}},{\"@Id\":\"49\",\"@Name\":\"Program4\",\"Projects\":[{\"@Id\":\"2\",\"@Name\":\"Test1\"},{\"@Id\":\"3\",\"@Name\":\"Test2\"}]}]}}}}"}

我我一直無法將數據(json)綁定到圖表組件,以便成功顯示工作流程。我需要將json字符串綁定到圖表組件的幫助。

劍道代碼:

<div id="visual"></div>     
 
var dsRelationshipMatrix = new kendo.data.DataSource({ 
 
         transport: { 
 
          read: function (options) { 
 
           $.ajax({ 
 
            url: "wcf service return json string", 
 
            contentType: "application/json; charset=utf-8", 
 
            dataType: "json", 
 
            type: "GET", 
 
            success: function (result) { 
 
             var obj = $.parseJSON(result.d); 
 
             if (obj == null) { 
 
              options.success([]); 
 
             } else { 
 
              options.success(obj); 
 
             } 
 
            }, 
 
            error: function (result) { 
 
             options.error(result) 
 
            } 
 
           }); 
 
          } 
 

 
         }, 
 
         schema: { 
 
          data: function (data) { 
 
           return data 
 
          } 
 

 
         } 
 
        }); //closes data source 
 
        function createDiagram() { 
 
         $("#visual").kendoDiagram({ 
 
          dataSource: new kendo.data.HierarchicalDataSource({ 
 
           data: dsRelationshipMatrix, 
 
           schema: { 
 
            model: { 
 
             children: "Strategies" 
 
            } 
 
           } 
 
          }), 
 
          layout: { 
 
           type: "layered" 
 
          }, 
 
          shapeDefaults: { 
 
           visual: visualTemplate 
 
          }, 
 
          connectionDefaults: { 
 
           stroke: { 
 
            color: "#979797", 
 
            width: 2 
 
           } 
 
          } 
 
         }); 
 

 
         var diagram = $("#visual").getKendoDiagram(); 
 
         diagram.bringIntoView(diagram.shapes); 
 
        }

+1

嗨,歡迎來到SO。你能否更清楚地說明你的問題?閱讀本文[http://stackoverflow.com/help/how-to-ask](http://stackoverflow.com/help/how-to-ask)。但是我必須補充說明你的問題很好地添加了很多信息。 :) – 2014-09-23 21:54:56

+0

我需要能夠在kendo中設置分層數據源,以便填充圖組件中的數據。花了一些時間研究之後,我認爲問題在於我的數據在其層次結構中有多個層次,並且我無法使用kendo中的數據源層次模型正確設置層次結構。部門可能有許多策略,策略可能有很多程序和程序可能有很多項目。所以問題是如何在kendo中設置分層數據源來支持結構化的提及。我願意使用json或xml來獲取數據。 – 2014-09-25 20:08:34

+0

順便說一句,我很抱歉不直接當我第一次發佈「問題」 – 2014-09-25 20:12:22

回答

0

經歷了痛苦的一段時間去後,我得到它的工作,並希望與大家分享這些信息。這可能不是完美的方式,但它是實現它的方法之一。 關鍵是將SQL數據的結構(提取爲XML)。

在SQL中,我最終執行了一個遞歸循環,提取數據並將其格式化爲XML。因此ROOT的根節點包含一個項目(部門 - 只能有一個部門),每個層次類別都有一個項目部分,項目部分作爲項目的子項目。措辭的結構是相當困難所以...

SQL:

SELECT 
    --dStakeholder.StakeholderId AS '@Id', 
    dStakeholder.FunctionalDepartment as 'item/info' , 
    '#1696d3' as 'item/colorScheme', 
    (SELECT 
     --dStrategy.StrategyId AS '@Id', 
     dStrategy.StrategyDescription 'item/info', 
     '#1696d3' as 'item/colorScheme' , 
     (Select 
      --dPrograms.ProgramId as '@Id', 
      dPrograms.ProgramDescription 'item/info' , 
      '#1696d3' as 'item/colorScheme' , 
      (Select 
       --dHeaders.ProjectId as '@Id', 
       dHeaders.ProjectName 'item/info', 
       '#1696d3' as 'item/colorScheme' 
        from 
        dbo.ProjectHeaders as dHeaders 
         inner join (select distinct projectid, programid, departmentid from dbo.ProjectHeaders) as pp 
          on dHeaders.ProjectId = pp.ProjectId 
         where pp.ProgramId = dPrograms.ProgramId and pp.departmentid = dStakeholder.Stakeholderid 
          FOR XML PATH(''), TYPE 
      ) as 'item/items' 
      from 
      dbo.ProjectPrograms as dPrograms 
      inner join (select distinct programid, strategyid , departmentid from dbo.ProjectHeaders) as sp 
       on dPrograms.ProgramId = sp.ProgramId 
      where sp.StrategyId = dStrategy.StrategyId and sp.departmentid = dstakeholder.stakeholderid 
      FOR XML PATH(''), TYPE 
     ) as 'item/items' 
    FROM 
     dbo.ProjectStrategies as dStrategy 
     inner join (select distinct strategyid , departmentid from dbo.ProjectHeaders) as bss 
      on dStrategy.StrategyId = bss.StrategyId 
    WHERE 
     dStakeholder.StakeholderId = bss.DepartmentId 
    FOR XML PATH(''), TYPE 
    ) as 'item/items' 
FROM 
    dbo.Stakeholders as dStakeholder 
FOR XML PATH('root'), type 

我從SQL數據XML以這種方式出現:

<root> 
 
    <item> 
 
    <info>ERISA Compliance Services Department</info> 
 
    <colorScheme>#1696d3</colorScheme> 
 
    <items> 
 
     <item> 
 
     <info>New Commission</info> 
 
     <colorScheme>#1696d3</colorScheme> 
 
     <items> 
 
      <item> 
 
      <info>Program3</info> 
 
      <colorScheme>#1696d3</colorScheme> 
 
      <items> 
 
       <item> 
 
       <info>test3</info> 
 
       <colorScheme>#1696d3</colorScheme> 
 
       </item> 
 
      </items> 
 
      </item> 
 
     </items> 
 
     </item> 
 
     <item> 
 
     <info>SAGA Development</info> 
 
     <colorScheme>#1696d3</colorScheme> 
 
     <items> 
 
      <item> 
 
      <info>Program1</info> 
 
      <colorScheme>#1696d3</colorScheme> 
 
      <items> 
 
       <item> 
 
       <info>Test1</info> 
 
       <colorScheme>#1696d3</colorScheme> 
 
       </item> 
 
      </items> 
 
      </item> 
 
      <item> 
 
      <info>Program4</info> 
 
      <colorScheme>#1696d3</colorScheme> 
 
      <items> 
 
       <item> 
 
       <info>Test2</info> 
 
       <colorScheme>#1696d3</colorScheme> 
 
       </item> 
 
      </items> 
 
      </item> 
 
     </items> 
 
     </item> 
 
    </items> 
 
    </item> 
 
</root>

現在我通過我的XML並獲取重要信息。 VB.net中的代碼。有一個項目類只列出我需要的屬性。

  conn.Open() 
     Dim dt As New DataTable 
     Dim da As New SqlDataAdapter("uspGetRelationshipMatrix " + Convert.ToString(StakeholderId), conn) 
     da.Fill(dt) 
     Dim sb = New StringBuilder() 
     If dt.Rows.Count <> 0 Then 
      For Each row As DataRow In dt.Rows 
       sb.Append(row.Item("Data")) 
      Next 
     End If 
     conn.Close() 


     xmlDoc.LoadXml(sb.ToString) 

     Dim itemList As New List(Of Item) 
     Dim RootNode As XmlNode 
     RootNode = xmlDoc.SelectSingleNode("/root") 

     For Each DeptNode As XmlNode In RootNode.ChildNodes 
      Dim deptItem As New Item 
      'check to ensure that is not nothing 
      Dim info As XmlNode = DeptNode.SelectSingleNode("info") 
      Dim cs As XmlNode = DeptNode.SelectSingleNode("colorScheme") 
      deptItem.info = info.InnerText 
      deptItem.colorScheme = cs.InnerText 
      'Begin items loop for child nodes 
      Dim stratItems As XmlNode = DeptNode.SelectSingleNode("items") 
      For Each stratItemNode As XmlNode In stratItems.ChildNodes 
       Dim stratItem As New Item 
       Dim stratinfo As XmlNode = stratItemNode.SelectSingleNode("info") 
       Dim stratcs As XmlNode = stratItemNode.SelectSingleNode("colorScheme") 
       stratItem.info = stratinfo.InnerText 
       stratItem.colorScheme = stratcs.InnerText 
       'place start loop 
       Dim progItems As XmlNode = stratItemNode.SelectSingleNode("items") 
       For Each progItemNode As XmlNode In progItems.ChildNodes 
        Dim progItem As New Item 
        Dim proginfo As XmlNode = progItemNode.SelectSingleNode("info") 
        Dim progcs As XmlNode = progItemNode.SelectSingleNode("colorScheme") 
        progItem.info = proginfo.InnerText 
        progItem.colorScheme = progcs.InnerText 
        'place start loop 
        Dim projItems As XmlNode = progItemNode.SelectSingleNode("items") 
        For Each projItemNode As XmlNode In projItems.ChildNodes 
         Dim projItem As New Item 
         Dim projinfo As XmlNode = projItemNode.SelectSingleNode("info") 
         Dim projcs As XmlNode = projItemNode.SelectSingleNode("colorScheme") 
         projItem.info = projinfo.InnerText 
         projItem.colorScheme = projcs.InnerText 
         'place start loop 
         'place end loop 
         progItem.items.Add(projItem) 
        Next 
        'place end loop 
        stratItem.items.Add(progItem) 
       Next 
       'place end loop 
       deptItem.items.Add(stratItem) 
      Next 
      'end items loop 
      itemList.Add(deptItem) 
     Next 

然後我在vb.net中使用newtonsoft json來將信息顯示爲json字符串。 JSON字符串:

[  

{ 「信息」: 「ERISA合規服務部」, 「COLORSCHEME」: 「#1696d3」, 「項目」: { 「信息」: 「新的委員會」, 「COLORSCHEME」: 「#1696d3」, 「項目」: { 「信息」: 「節目3」, 「COLORSCHEME」: 「#1696d3」, 「項目」: { 「info」:「test3」, 「色彩方案」: 「#1696d3」, 「項目」:

    ] 
       } 
       ] 
      } 
     ] 
    }, 
    {  
     "info":"SAGA Development", 
     "colorScheme":"#1696d3", 
     "items":[  
      {  
       "info":"Program1", 
       "colorScheme":"#1696d3", 
       "items":[  
       {  
        "info":"Test1", 
        "colorScheme":"#1696d3", 
        "items":[  

        ] 
       } 
       ] 
      }, 
      {  
       "info":"Program4", 
       "colorScheme":"#1696d3", 
       "items":[  
       {  
        "info":"Test2", 
        "colorScheme":"#1696d3", 
        "items":[  

        ] 
       } 
       ] 
      } 
     ] 
    } 
    ] 

} ]

隨着這個結構進行格式化,現在JSON我剛插入的json到劍道圖,現在你獲得流動的視覺分層圖像。