2014-09-23 66 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到剑道图,现在你获得流动的视觉分层图像。