if I add IconicNodeA, IconicNodeB and IconicNodeC to GoView1:
And if B and C are children of A
How do I add a Golink between them to show the relationship?
GoLink linkAB = new GoLink();
linkAB.FromPort = IconicNodeA.Port;
linkAB.ToPort = IconicNodeB.Port;
GoView1.Document.Add(linkAB);
GoLink linkAC = new GoLink();
linkAC.FromPort = IconicNodeA.Port;
linkAC.ToPort = IconicNodeC.Port;
GoView1.Document.Add(linkAC);
Of course you might want to set other properties on the links, such as setting GoLink.ToArrow true.
I’m trying to add the nodes dynamically from a DataView so nodes are not individually declared objects with unique names:
Dim dv As New DataView(Me.MyDataSet.Tables(0))
dv.Sort = “ParentID, ID”
Dim i As Int16 = 0
For i = 0 To dv.Count - 1
MyView.Document.Add(MakeIconicNode(“rocket.ico”, dv(i)(“ID”).ToString(), dv(i)(“ParentID”).ToString(), dv(i)(“Name”).ToString()))
If Int(dv(i)(“ParentID”)) <> 0 Then
'add link from parent to this node and add it to the Goview
End If
Next
—
Public Function MakeIconicNode(ByVal file As String, ByVal id As String, ByVal parentnode As String, ByVal label As String) As GoObject
Dim n As GoIconicNode = New GoIconicNode()
n.Initialize(Nothing, file, id)
’ labels are editable, but may be disabled by setting myView.AllowEdit to false
n.Editable = True
n.Label.Editable = True
n.Icon.Size = New SizeF(20, 20)
’ port is whole icon. but linking may be disabled by setting myView.AllowLink to false
n.Port.Bounds = n.Icon.Bounds
n.ToolTipText = "Tooltip for " & label
n.Text = label
Return n
End Function
*** Where do I create/add the golink? ***
Where you have the comment:
[quote]'add link from parent to this node and add it to the Goview[/quote]
At that point you just created the “child” node – you just need to find the “parent” node too, so that you can connect their Ports.
First: you aren’t saving the ID anywhere in the GoIconicNode that you allocate – you could use the UserObject or UserFlags properties, if you like.
Second: you need to be able to find a node with a given identifier. The simplest (but slow) solution is to enumerate over all of the objects in the document: if it’s a GoIconicNode, then compare the property where you saved the identifier.
Many of the sample applications do something like what you are doing. There is example code in the User Guide too.
I thought I was saving the ID with: n.Initialize(Nothing, file, id)
Yes, but then you re-set the same property by doing: n.Text = label
That’s because the node’s Text property is by default defined to be the same as the node’s Label’s Text property.
so I have to initialize with the id, hide the text, and add a gotext for what I really want the text to say (the label text)?
Pass the “label” as the third argument to Initialize – that way you don’t have to set the .Text explicitly.
Set the .UserObject property to be the “id” value.
Your iteration through the document to find a particular node would be something like:
Public Function FindNode(ByVal someID as String) As GoIconicNode
For Each obj In MyView.Document
If TypeOf obj Is GoIconicNode Then
Dim n As GoIconicNode = CType(obj, GoIconicNode)
If n.UserObject = someID Then Return n
End If
Next obj
Return Nothing
End Function
Hi. Sorry if my english is not very good. I am Portuguese
Depending on the type of your ID, you can use the GoIconicNode.UserObject property or the GoIconicNode.UserFlags property. If you have a lot of nodes, you may need to keep a mapping of your IDs to these nodes by using a Hashtable, since a linear search through the whole document could be too slow if you do it often.
Sorry my ignorance but i can´t implement the function findNode in C#. How can i write this two lines in C#:
Dim n As GoIconicNode = CType(obj, GoIconicNode)
You can see examples of this code in the section “Traversing a Diagram” in the User Guide.
Thanks Walter.