/// <summary> /// Sets the root node for the control. /// 设置控件的根节点。 /// </summary> public void SetRoot(Browser browser, NodeId rootId) { Clear(); ShowReferencesMI.Checked = m_showReferences; m_rootId = rootId; m_browser = browser; if (m_browser != null) { m_browser.MoreReferences += m_BrowserMoreReferences; } // check if session is connected. if (m_browser == null || !m_browser.Session.Connected) { return; } if (NodeId.IsNull(rootId)) { m_rootId = Objects.RootFolder; } if (m_browser != null) { INode node = m_browser.Session.NodeCache.Find(m_rootId); if (node == null) { return; } //引用描述 ReferenceDescription reference = new ReferenceDescription(); reference.ReferenceTypeId = ReferenceTypeIds.References; reference.IsForward = true; reference.NodeId = node.NodeId; reference.NodeClass = (NodeClass)node.NodeClass; reference.BrowseName = node.BrowseName; reference.DisplayName = node.DisplayName; reference.TypeDefinition = null; string text = GetTargetText(reference); string icon = GuiUtils2.GetTargetIcon(m_browser.Session, reference); TreeNode root = AddNode(null, reference, text, icon); root.Nodes.Add(new TreeNode()); root.Expand(); } }
/// <summary> /// Displays the target of a browse operation in the control. /// </summary> private void Browse(NodeId startId) { if (m_browser == null || NodeId.IsNull(startId)) { Clear(); return; } List <ItemData> variables = new List <ItemData>(); // browse the references from the node and build list of variables. BeginUpdate(); foreach (ReferenceDescription reference in m_browser.Browse(startId)) { Node target = m_session.NodeCache.Find(reference.NodeId) as Node; if (target == null) { continue; } ReferenceTypeNode referenceType = m_session.NodeCache.Find(reference.ReferenceTypeId) as ReferenceTypeNode; Node typeDefinition = null; if ((target.NodeClass & (NodeClass.Variable | NodeClass.Object)) != 0) { typeDefinition = m_session.NodeCache.Find(reference.TypeDefinition) as Node; } else { typeDefinition = m_session.NodeCache.Find(m_session.NodeCache.TypeTree.FindSuperType(target.NodeId)) as Node; } ItemData item = new ItemData(referenceType, !reference.IsForward, target, typeDefinition); AddItem(item, GuiUtils2.GetTargetIcon(m_browser.Session, reference), -1); if ((target.NodeClass & (NodeClass.Variable | NodeClass.VariableType)) != 0) { variables.Add(item); } } EndUpdate(); // read the current value for any variables. if (variables.Count > 0) { ReadValueIdCollection nodesToRead = new ReadValueIdCollection(); foreach (ItemData item in variables) { ReadValueId valueId = new ReadValueId(); valueId.NodeId = item.Target.NodeId; valueId.AttributeId = Attributes.Value; valueId.IndexRange = null; valueId.DataEncoding = null; nodesToRead.Add(valueId); } DataValueCollection values; DiagnosticInfoCollection diagnosticInfos; m_session.Read( null, 0, TimestampsToReturn.Neither, nodesToRead, out values, out diagnosticInfos); ClientBase.ValidateResponse(values, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); for (int ii = 0; ii < variables.Count; ii++) { variables[ii].Value = values[ii]; foreach (ListViewItem item in ItemsLV.Items) { if (Object.ReferenceEquals(item.Tag, variables[ii])) { UpdateItem(item, variables[ii]); break; } } } } AdjustColumns(); }
/// <summary> /// Adds a target to the tree control. /// </summary> private void AddReferences(TreeNode parent, ReferenceDescriptionCollection references) { foreach (ReferenceDescription reference in references) { if (reference.ReferenceTypeId.IsNullNodeId) { Utils.Trace("Reference {0} has null reference type id", reference.DisplayName); continue; } ReferenceTypeNode typeNode = m_browser.Session.NodeCache.Find(reference.ReferenceTypeId) as ReferenceTypeNode; if (typeNode == null) { Utils.Trace("Reference {0} has invalid reference type id.", reference.DisplayName); continue; } if (m_browser.BrowseDirection == BrowseDirection.Forward && !reference.IsForward || m_browser.BrowseDirection == BrowseDirection.Inverse && reference.IsForward) { Utils.Trace("Reference's IsForward value is: {0}, but the browse direction is: {1}; for reference {2}", reference.IsForward, m_browser.BrowseDirection, reference.DisplayName); continue; } if (reference.NodeId == null || reference.NodeId.IsNull) { Utils.Trace("The node id of the reference {0} is NULL.", reference.DisplayName); continue; } if (reference.BrowseName == null || reference.BrowseName.Name == null) { Utils.Trace("Browse name is empty for reference {0}", reference.DisplayName); continue; } if (!Enum.IsDefined(typeof(Opc.Ua.NodeClass), reference.NodeClass) || reference.NodeClass == NodeClass.Unspecified) { Utils.Trace("Node class is an unknown or unspecified value, for reference {0}", reference.DisplayName); continue; } if (m_browser.NodeClassMask != 0 && m_browser.NodeClassMask != 255) { if (reference.TypeDefinition == null || reference.TypeDefinition.IsNull) { Utils.Trace("Type definition is null for reference {0}", reference.DisplayName); continue; } } // suppress duplicate references. if (!m_showReferences) { bool exists = false; foreach (TreeNode existingChild in parent.Nodes) { ReferenceDescription existingReference = existingChild.Tag as ReferenceDescription; if (existingReference != null) { if (existingReference.NodeId == reference.NodeId) { exists = true; break; } } } if (exists) { continue; } } string text = GetTargetText(reference); string icon = GuiUtils2.GetTargetIcon(m_browser.Session, reference); TreeNode container = parent; if (m_showReferences) { container = FindReferenceTypeContainer(parent, reference); } if (container != null) { TreeNode child = AddNode(container, reference, text, icon); child.Nodes.Add(new TreeNode()); } } }