/// <summary> /// Updates the row with the node to read. /// </summary> public void UpdateRow(DataRow row, InstanceDeclaration declaration) { row[0] = declaration; row[1] = ImageList.Images[ClientUtils.GetImageIndex((declaration.NodeClass == NodeClass.Variable) ? Attributes.Value : Attributes.NodeId, null)]; row[2] = declaration.DisplayPath; row[3] = declaration.DataTypeDisplayText; row[4] = declaration.Description; }
/// <summary> /// Creates a new instance of a FilterDeclarationField. /// </summary> public FilterDeclarationField(InstanceDeclaration instanceDeclaration) { Selected = true; DisplayInList = false; FilterEnabled = false; FilterOperator = FilterOperator.Equals; FilterValue = Variant.Null; InstanceDeclaration = instanceDeclaration; }
/// <summary> /// Reads the values displayed in the control and moves to the display results state. /// </summary> public void Read() { if (m_session == null) { throw new ServiceResultException(StatusCodes.BadNotConnected); } // build list of values to read. ReadValueIdCollection nodesToRead = new ReadValueIdCollection(); foreach (DataGridViewRow row in ResultsDV.Rows) { DataRowView source = row.DataBoundItem as DataRowView; InstanceDeclaration value = (InstanceDeclaration)source.Row[0]; row.Selected = false; ReadValueId nodeToRead = new ReadValueId(); nodeToRead.NodeId = value.NodeId; nodeToRead.AttributeId = (value.NodeClass == NodeClass.Variable) ? Attributes.Value : Attributes.NodeId; nodesToRead.Add(nodeToRead); } // read the values. DataValueCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.Read( null, 0, TimestampsToReturn.Both, nodesToRead, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); DescriptionCH.Visible = false; ValueCH.Visible = true; // add the results to the display. for (int ii = 0; ii < results.Count; ii++) { DataRowView source = ResultsDV.Rows[ii].DataBoundItem as DataRowView; UpdateRow(source.Row, results[ii]); } }
/// <summary> /// Shows all fields for the current condition. /// </summary> public bool ShowDialog(FilterDeclaration filter, VariantCollection fields) { // fill in dialog. for (int ii = 0; ii < filter.Fields.Count; ii++) { InstanceDeclaration instance = filter.Fields[ii].InstanceDeclaration; ListViewItem item = new ListViewItem(instance.DisplayPath); item.SubItems.Add(instance.DataTypeDisplayText); string text = null; // check for missing fields. if (fields.Count <= ii + 1 || fields[ii + 1].Value == null) { text = String.Empty; } // use default string format. else { text = fields[ii + 1].ToString(); } item.SubItems.Add(text); item.Tag = filter.Fields[ii]; FieldsLV.Items.Add(item); } // adjust columns. for (int ii = 0; ii < FieldsLV.Columns.Count; ii++) { FieldsLV.Columns[ii].Width = -2; } // display the dialog. if (ShowDialog() != DialogResult.OK) { return(false); } return(true); }
/// <summary> /// Collects the fields for the instance node. /// </summary> private static void CollectInstanceDeclarations( Session session, NodeId typeId, InstanceDeclaration parent, List <InstanceDeclaration> instances, IDictionary <string, InstanceDeclaration> map) { // find the children. BrowseDescription nodeToBrowse = new BrowseDescription(); if (parent == null) { nodeToBrowse.NodeId = typeId; } else { nodeToBrowse.NodeId = parent.NodeId; } nodeToBrowse.BrowseDirection = BrowseDirection.Forward; nodeToBrowse.ReferenceTypeId = ReferenceTypeIds.HasChild; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.NodeClassMask = (uint)(NodeClass.Object | NodeClass.Variable | NodeClass.Method); nodeToBrowse.ResultMask = (uint)BrowseResultMask.All; // ignore any browsing errors. ReferenceDescriptionCollection references = ClientUtils.Browse(session, nodeToBrowse, false); if (references == null) { return; } // process the children. List <NodeId> nodeIds = new List <NodeId>(); List <InstanceDeclaration> children = new List <InstanceDeclaration>(); for (int ii = 0; ii < references.Count; ii++) { ReferenceDescription reference = references[ii]; if (reference.NodeId.IsAbsolute) { continue; } // create a new declaration. InstanceDeclaration child = new InstanceDeclaration(); child.RootTypeId = typeId; child.NodeId = (NodeId)reference.NodeId; child.BrowseName = reference.BrowseName; child.NodeClass = reference.NodeClass; if (!LocalizedText.IsNullOrEmpty(reference.DisplayName)) { child.DisplayName = reference.DisplayName.Text; } else { child.DisplayName = reference.BrowseName.Name; } if (parent != null) { child.BrowsePath = new QualifiedNameCollection(parent.BrowsePath); child.BrowsePathDisplayText = Utils.Format("{0}/{1}", parent.BrowsePathDisplayText, reference.BrowseName); child.DisplayPath = Utils.Format("{0}/{1}", parent.DisplayPath, reference.DisplayName); } else { child.BrowsePath = new QualifiedNameCollection(); child.BrowsePathDisplayText = Utils.Format("{0}", reference.BrowseName); child.DisplayPath = Utils.Format("{0}", reference.DisplayName); } child.BrowsePath.Add(reference.BrowseName); // check if reading an overridden declaration. InstanceDeclaration overriden = null; if (map.TryGetValue(child.BrowsePathDisplayText, out overriden)) { child.OverriddenDeclaration = overriden; } map[child.BrowsePathDisplayText] = child; // add to list. children.Add(child); nodeIds.Add(child.NodeId); } // check if nothing more to do. if (children.Count == 0) { return; } // find the modelling rules. List <NodeId> modellingRules = FindTargetOfReference(session, nodeIds, Opc.Ua.ReferenceTypeIds.HasModellingRule, false); if (modellingRules != null) { for (int ii = 0; ii < nodeIds.Count; ii++) { children[ii].ModellingRule = modellingRules[ii]; // if the modelling rule is null then the instance is not part of the type declaration. if (NodeId.IsNull(modellingRules[ii])) { map.Remove(children[ii].BrowsePathDisplayText); } } } // update the descriptions. UpdateInstanceDescriptions(session, children, false); // recusively collect instance declarations for the tree below. for (int ii = 0; ii < children.Count; ii++) { if (!NodeId.IsNull(children[ii].ModellingRule)) { instances.Add(children[ii]); CollectInstanceDeclarations(session, typeId, children[ii], instances, map); } } }
/// <summary> /// Finds the targets for the specified reference. /// </summary> private static void UpdateInstanceDescriptions(Session session, List <InstanceDeclaration> instances, bool throwOnError) { try { ReadValueIdCollection nodesToRead = new ReadValueIdCollection(); for (int ii = 0; ii < instances.Count; ii++) { ReadValueId nodeToRead = new ReadValueId(); nodeToRead.NodeId = instances[ii].NodeId; nodeToRead.AttributeId = Attributes.Description; nodesToRead.Add(nodeToRead); nodeToRead = new ReadValueId(); nodeToRead.NodeId = instances[ii].NodeId; nodeToRead.AttributeId = Attributes.DataType; nodesToRead.Add(nodeToRead); nodeToRead = new ReadValueId(); nodeToRead.NodeId = instances[ii].NodeId; nodeToRead.AttributeId = Attributes.ValueRank; nodesToRead.Add(nodeToRead); } // start the browse operation. DataValueCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; session.Read( null, 0, TimestampsToReturn.Neither, nodesToRead, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead); // update the instances. for (int ii = 0; ii < nodesToRead.Count; ii += 3) { InstanceDeclaration instance = instances[ii / 3]; instance.Description = results[ii].GetValue <LocalizedText>(LocalizedText.Null).Text; instance.DataType = results[ii + 1].GetValue <NodeId>(NodeId.Null); instance.ValueRank = results[ii + 2].GetValue <int>(ValueRanks.Any); if (!NodeId.IsNull(instance.DataType)) { instance.BuiltInType = DataTypes.GetBuiltInType(instance.DataType, session.TypeTree); instance.DataTypeDisplayText = session.NodeCache.GetDisplayText(instance.DataType); if (instance.ValueRank >= 0) { instance.DataTypeDisplayText += "[]"; } } } } catch (Exception exception) { if (throwOnError) { throw new ServiceResultException(exception, StatusCodes.BadUnexpectedError); } } }
private void FilterDV_CellDoubleClick(object sender, DataGridViewCellEventArgs e) { try { if (e.RowIndex == -1) { return; } DataRowView source = FilterDV.Rows[e.RowIndex].DataBoundItem as DataRowView; FilterDeclarationField field = (FilterDeclarationField)source.Row[0]; if (e.ColumnIndex == 5) { FilterOperator filterOperator = field.FilterOperator; if (new SetFilterOperatorDlg().ShowDialog(ref filterOperator)) { field.FilterEnabled = true; source.Row[5] = field.FilterEnabled; field.FilterOperator = filterOperator; source.Row[6] = field.FilterOperator; } return; } if (e.ColumnIndex == 6) { if (field.FilterOperator == FilterOperator.IsNull) { field.FilterValue = Variant.Null; return; } InstanceDeclaration declaration = field.InstanceDeclaration; object result = new EditComplexValueDlg().ShowDialog( m_session, declaration.DisplayName, declaration.DataType, declaration.ValueRank, field.FilterValue.Value, "Edit Filter Value"); if (result != null) { field.FilterEnabled = true; source.Row[5] = field.FilterEnabled; source.Row[6] = field.FilterOperator; field.FilterValue = new Variant(result); source.Row[7] = field.FilterValue; } return; } } catch (Exception exception) { ClientUtils.HandleException(this.Text, exception); } }