/// <summary> /// Updates the application after connecting to or disconnecting from the server. /// </summary> private void Server_ConnectComplete(object sender, EventArgs e) { try { m_session = ConnectServerCTRL.Session; if (m_session == null) { return; } // set a suitable initial state. if (m_session != null && !m_connectedOnce) { m_connectedOnce = true; EventsLV.IsSubscribed = false; EventsLV.DisplayConditions = true; EventsLV.ChangeArea(Opc.Ua.ObjectIds.Server, false); FilterDeclaration filter = new FilterDeclaration(); ushort namespaceIndex = (ushort)m_session.NamespaceUris.GetIndex(DsatsDemo.Namespaces.DsatsDemo); filter.EventTypeId = ExpandedNodeId.ToNodeId(DsatsDemo.ObjectTypeIds.LockConditionType, m_session.NamespaceUris); filter.AddSimpleField(String.Empty, BuiltInType.NodeId, false); filter.AddSimpleField(Opc.Ua.BrowseNames.EventId, BuiltInType.ByteString, false); filter.AddSimpleField(Opc.Ua.BrowseNames.EventType, BuiltInType.NodeId, false); filter.AddSimpleField(Opc.Ua.BrowseNames.ConditionName, BuiltInType.String, true); filter.AddSimpleField(new QualifiedName[] { new QualifiedName(DsatsDemo.BrowseNames.LockState, namespaceIndex), new QualifiedName(Opc.Ua.BrowseNames.CurrentState) }, BuiltInType.String, ValueRanks.Scalar, true); filter.AddSimpleField(new QualifiedName(DsatsDemo.BrowseNames.ClientUserId, namespaceIndex), BuiltInType.String, true); filter.AddSimpleField(new QualifiedName(DsatsDemo.BrowseNames.SubjectName, namespaceIndex), BuiltInType.String, true); filter.AddSimpleField(new QualifiedName(DsatsDemo.BrowseNames.SessionId, namespaceIndex), BuiltInType.NodeId, true); EventsLV.ChangeFilter(filter, true); m_filter = filter; PhaseCB.Items.Clear(); BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = new NodeId(DsatsDemo.Objects.Rig_Phases, namespaceIndex); nodeToBrowse.ReferenceTypeId = Opc.Ua.ReferenceTypeIds.HierarchicalReferences; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.BrowseDirection = BrowseDirection.Forward; nodeToBrowse.ResultMask = (uint)BrowseResultMask.All; DataValue value = m_session.ReadValue(new NodeId(DsatsDemo.Variables.Rig_CurrentPhase, namespaceIndex)); NodeId currentPhase = value.GetValue<NodeId>(null); ReferenceDescriptionCollection references = ClientUtils.Browse(m_session, nodeToBrowse, false); if (references != null) { for (int ii = 0; ii < references.Count; ii++) { PhaseCB.Items.Add(references[ii]); if (currentPhase == references[ii].NodeId) { PhaseCB.SelectedIndex = ii; } } } m_connectedOnce = true; } EventsLV.IsSubscribed = true; EventsLV.ChangeSession(m_session, true); EventsLV.ConditionRefresh(); } catch (Exception exception) { MessageBox.Show(exception.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error); } }
private void EventTypeBTN_Click(object sender, EventArgs e) { try { if (m_session == null) { return; } TypeDeclaration type = new SelectTypeDlg().ShowDialog(m_session, Opc.Ua.ObjectTypeIds.BaseEventType, "Select Event Type"); if (type == null) { return; } m_filter = new FilterDeclaration(type, m_filter); EventTypeTB.Text = m_session.NodeCache.GetDisplayText(m_filter.EventTypeId); EventFilterTB.Text = GetFilterFields(m_filter); ResultsLV.ChangeFilter(m_filter, false); } catch (Exception exception) { ClientUtils.HandleException(this.Text, exception); } }
/// <summary> /// Displays the available areas in a tree view. /// </summary> /// <param name="session">The session.</param> /// <returns></returns> public bool ShowDialog(FilterDeclaration filter) { m_filter = filter; Populate(); // display the dialog. if (ShowDialog() != DialogResult.OK) { return(false); } // update filter. List <FilterDeclarationField> fields = new List <FilterDeclarationField>(); for (int ii = 0; ii < EventFieldsLV.Items.Count; ii++) { ListViewItem item = EventFieldsLV.Items[ii]; FilterItem field = item.Tag as FilterItem; if (field != null) { field.Declaration.DisplayInList = field.DisplayInList; field.Declaration.FilterEnabled = field.FilterEnabled; field.Declaration.FilterOperator = field.FilterOperator; field.Declaration.FilterValue = field.FilterValue; fields.Add(field.Declaration); } } filter.Fields = fields; // return the result. return(true); }
/// <summary> /// Changes the filter used to select the events. /// </summary> public void ChangeFilter(FilterDeclaration filter, bool fetchRecent) { m_filter = filter; EventsLV.Items.Clear(); int index = 0; // add or update existing columns. for (int ii = 0; ii < m_filter.Fields.Count; ii++) { if (m_filter.Fields[ii].DisplayInList) { if (index >= EventsLV.Columns.Count) { EventsLV.Columns.Add(new ColumnHeader()); } EventsLV.Columns[index].Text = m_filter.Fields[ii].InstanceDeclaration.DisplayName; EventsLV.Columns[index].TextAlign = HorizontalAlignment.Left; index++; } } // remove extra columns. while (index < EventsLV.Columns.Count) { EventsLV.Columns.RemoveAt(EventsLV.Columns.Count - 1); } // adjust the width of the columns. for (int ii = 0; ii < EventsLV.Columns.Count; ii++) { EventsLV.Columns[ii].Width = -2; } // fetch recent history. if (fetchRecent) { ReadRecentHistory(); } // update subscription. if (m_subscription != null) { m_monitoredItem.Filter = m_filter.GetFilter(); m_subscription.ApplyChanges(); } }
/// <summary> /// Displays the dialog. /// </summary> public bool ShowDialog(Session session, NodeId areaId, FilterDeclaration filter) { m_session = session; m_areaId = areaId; m_filter = filter; EventAreaTB.Text = session.NodeCache.GetDisplayText(m_areaId); EventTypeTB.Text = session.NodeCache.GetDisplayText(filter.EventTypeId); EventFilterTB.Text = GetFilterFields(m_filter); ResultsLV.IsSubscribed = false; ResultsLV.ChangeSession(session, false); ResultsLV.ChangeArea(areaId, false); ResultsLV.ChangeFilter(filter, false); // get the beginning of data. DateTime startTime; try { startTime = ReadFirstDate().ToLocalTime(); } catch (Exception) { startTime = new DateTime(2000, 1, 1); } StartTimeDP.Value = startTime; StartTimeCK.Checked = true; EndTimeDP.Value = DateTime.Now; EndTimeCK.Checked = true; MaxReturnValuesNP.Value = 10; MaxReturnValuesCK.Checked = true; GoBTN.Visible = true; NextBTN.Visible = false; StopBTN.Enabled = false; if (ShowDialog() != DialogResult.OK) { return(false); } return(true); }
/// <summary> /// Displays the dialog. /// </summary> public bool ShowDialog(Session session, NodeId areaId, FilterDeclaration filter) { m_session = session; m_areaId = areaId; m_filter = filter; EventAreaTB.Text = session.NodeCache.GetDisplayText(m_areaId); EventTypeTB.Text = session.NodeCache.GetDisplayText(filter.EventTypeId); EventFilterTB.Text = GetFilterFields(m_filter); ResultsLV.IsSubscribed = false; ResultsLV.ChangeSession(session, false); ResultsLV.ChangeArea(areaId, false); ResultsLV.ChangeFilter(filter, false); // get the beginning of data. DateTime startTime; try { startTime = ReadFirstDate().ToLocalTime(); } catch (Exception) { startTime = new DateTime(2000, 1, 1); } StartTimeDP.Value = startTime; StartTimeCK.Checked = true; EndTimeDP.Value = DateTime.Now; EndTimeCK.Checked = true; MaxReturnValuesNP.Value = 10; MaxReturnValuesCK.Checked = true; GoBTN.Visible = true; NextBTN.Visible = false; StopBTN.Enabled = false; if (ShowDialog() != DialogResult.OK) { return false; } return true; }
/// <summary> /// Returns the filter fields formatted as a string. /// </summary> private string GetFilterFields(FilterDeclaration filter) { StringBuilder buffer = new StringBuilder(); foreach (FilterDeclarationField field in filter.Fields) { if (field.FilterEnabled) { if (buffer.Length > 0) { buffer.Append(", "); } buffer.Append(field.InstanceDeclaration.DisplayName); } } return(buffer.ToString()); }
/// <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 || fields[ii].Value == null) { text = String.Empty; } // use default string format. else { text = fields[ii].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> /// 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 || fields[ii].Value == null) { text = String.Empty; } // use default string format. else { text = fields[ii].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> /// Sets the filter to edit. /// </summary> public void SetFilter(FilterDeclaration filter) { m_filter = filter; m_dataset = new DataSet(); m_dataset.Tables.Add("Events"); m_dataset.Tables[0].Columns.Add("Event", typeof(VariantCollection)); if (m_filter != null) { foreach (FilterDeclarationField field in m_filter.Fields) { if (field.DisplayInList) { m_dataset.Tables[0].Columns.Add(field.InstanceDeclaration.DisplayName, typeof(string)); } } } EventsDV.DataSource = m_dataset.Tables[0]; }
/// <summary> /// Creates list item for an event. /// </summary> private ListViewItem CreateListItem(FilterDeclaration filter, VariantCollection fieldValues) { ListViewItem item = new ListViewItem(); item.Tag = fieldValues; for (int ii = 1; ii < fieldValues.Count; ii++) { if (!filter.Fields[ii - 1].DisplayInList) { continue; } string text = null; // check for missing fields. if (fieldValues[ii].Value == null) { text = String.Empty; } // display the name of a node instead of the node id. else if (fieldValues[ii].TypeInfo.BuiltInType == BuiltInType.NodeId) { INode node = m_session.NodeCache.Find((NodeId)fieldValues[ii].Value); if (node != null) { text = node.ToString(); } } // display local time for any time fields. else if (fieldValues[ii].TypeInfo.BuiltInType == BuiltInType.DateTime) { DateTime value = (DateTime)fieldValues[ii].Value; if (m_filter.Fields[ii - 1].InstanceDeclaration.DisplayName.Contains("Time")) { text = value.ToLocalTime().ToString("HH:mm:ss.fff"); } else { text = value.ToLocalTime().ToString("yyyy-MM-dd"); } } // use default string format. else { text = fieldValues[ii].ToString(); } // update subitem text. if (item.Text == String.Empty) { item.Text = text; item.SubItems[0].Text = text; } else { item.SubItems.Add(text); } } return(item); }
/// <summary> /// Sets the filter to edit. /// </summary> public void SetFilter(FilterDeclaration filter) { m_dataset.Tables[0].Rows.Clear(); if (filter != null) { foreach (FilterDeclarationField field in filter.Fields) { DataRow row = m_dataset.Tables[0].NewRow(); UpdateRow(row, field); m_dataset.Tables[0].Rows.Add(row); } } }
/// <summary> /// Returns the filter fields formatted as a string. /// </summary> private string GetFilterFields(FilterDeclaration filter) { StringBuilder buffer = new StringBuilder(); foreach (FilterDeclarationField field in filter.Fields) { if (field.FilterEnabled) { if (buffer.Length > 0) { buffer.Append(", "); } buffer.Append(field.InstanceDeclaration.DisplayName); } } return buffer.ToString(); }
/// <summary> /// Displays the available areas in a tree view. /// </summary> /// <param name="session">The session.</param> /// <returns></returns> public bool ShowDialog(FilterDeclaration filter) { m_filter = filter; Populate(); // display the dialog. if (ShowDialog() != DialogResult.OK) { return false; } // update filter. List<FilterDeclarationField> fields = new List<FilterDeclarationField>(); for (int ii = 0; ii < EventFieldsLV.Items.Count; ii++) { ListViewItem item = EventFieldsLV.Items[ii]; FilterItem field = item.Tag as FilterItem; if (field != null) { field.Declaration.DisplayInList = field.DisplayInList; field.Declaration.FilterEnabled = field.FilterEnabled; field.Declaration.FilterOperator = field.FilterOperator; field.Declaration.FilterValue = field.FilterValue; fields.Add(field.Declaration); } } filter.Fields = fields; // return the result. return true; }
/// <summary> /// Creates list item for an event. /// </summary> private ListViewItem CreateListItem(FilterDeclaration filter, VariantCollection fieldValues) { ListViewItem item = new ListViewItem(); item.Tag = fieldValues; for (int ii = 1; ii < fieldValues.Count; ii++) { if (!filter.Fields[ii-1].DisplayInList) { continue; } string text = null; // check for missing fields. if (fieldValues[ii].Value == null) { text = String.Empty; } // display the name of a node instead of the node id. else if (fieldValues[ii].TypeInfo.BuiltInType == BuiltInType.NodeId) { INode node = m_session.NodeCache.Find((NodeId)fieldValues[ii].Value); if (node != null) { text = node.ToString(); } } // display local time for any time fields. else if (fieldValues[ii].TypeInfo.BuiltInType == BuiltInType.DateTime) { DateTime value = (DateTime)fieldValues[ii].Value; if (m_filter.Fields[ii-1].InstanceDeclaration.DisplayName.Contains("Time")) { text = value.ToLocalTime().ToString("HH:mm:ss.fff"); } else { text = value.ToLocalTime().ToString("yyyy-MM-dd"); } } // use default string format. else { text = fieldValues[ii].ToString(); } // update subitem text. if (item.Text == String.Empty) { item.Text = text; item.SubItems[0].Text = text; } else { item.SubItems.Add(text); } } return item; }
/// <summary> /// Updates the filter from the controls. /// </summary> private void UpdateFilter() { // get selected declarations. List<InstanceDeclaration> declarations = new List<InstanceDeclaration>(); NodeId eventTypeId = CollectInstanceDeclarations(declarations); if (m_filter == null) { m_filter = new FilterDeclaration(); } if (m_filter.Fields == null || m_filter.Fields.Count == 0) { m_filter.Fields = new List<FilterDeclarationField>(); // select some default values to display in the list. AddDefaultFilter(m_filter.Fields, Opc.Ua.BrowseNames.EventType, true); AddDefaultFilter(m_filter.Fields, Opc.Ua.BrowseNames.SourceName, true); AddDefaultFilter(m_filter.Fields, Opc.Ua.BrowseNames.SourceNode, true); AddDefaultFilter(m_filter.Fields, Opc.Ua.BrowseNames.Time, true); AddDefaultFilter(m_filter.Fields, Opc.Ua.BrowseNames.Severity, true); AddDefaultFilter(m_filter.Fields, Opc.Ua.BrowseNames.Message, true); } // copy settings from existing filter. List<FilterDeclarationField> fields = new List<FilterDeclarationField>(); foreach (InstanceDeclaration declaration in declarations) { if (declaration.NodeClass != NodeClass.Variable) { continue; } FilterDeclarationField field = new FilterDeclarationField(declaration); foreach (FilterDeclarationField field2 in m_filter.Fields) { if (field2.InstanceDeclaration.BrowsePathDisplayText == field.InstanceDeclaration.BrowsePathDisplayText) { field.DisplayInList = field2.DisplayInList; field.FilterEnabled = field2.FilterEnabled; field.FilterOperator = field2.FilterOperator; field.FilterValue = field2.FilterValue; break; } } fields.Add(field); } // update filter. m_filter.EventTypeId = eventTypeId; m_filter.Fields = fields; }
/// <summary> /// Deletes the recent history. /// </summary> private void DeleteHistory(NodeId areaId, List<VariantCollection> events, FilterDeclaration filter) { // find the event id. int index = 0; foreach (FilterDeclarationField field in filter.Fields) { if (field.InstanceDeclaration.BrowseName == Opc.Ua.BrowseNames.EventId) { break; } index++; } // can't delete events if no event id. if (index >= filter.Fields.Count) { throw ServiceResultException.Create(StatusCodes.BadEventIdUnknown, "Cannot delete events if EventId was not selected."); } // build list of nodes to delete. DeleteEventDetails details = new DeleteEventDetails(); details.NodeId = areaId; foreach (VariantCollection e in events) { byte[] eventId = null; if (e.Count > index) { eventId = e[index].Value as byte[]; } details.EventIds.Add(eventId); } // delete the events. ExtensionObjectCollection nodesToUpdate = new ExtensionObjectCollection(); nodesToUpdate.Add(new ExtensionObject(details)); HistoryUpdateResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.HistoryUpdate( null, nodesToUpdate, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToUpdate); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToUpdate); if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(results[0].StatusCode); } // check for item level errors. if (results[0].OperationResults.Count > 0) { int count = 0; for (int ii = 0; ii < results[0].OperationResults.Count; ii++) { if (StatusCode.IsBad(results[0].OperationResults[ii])) { count++; } } // raise an error. if (count > 0) { throw ServiceResultException.Create( StatusCodes.BadEventIdUnknown, "Error deleting events. Only {0} of {1} deletes succeeded.", events.Count - count, events.Count); } } }
/// <summary> /// Displays the current filter components in the control. /// </summary> public void ShowFilter(FilterDeclaration filter) { m_declarations = new List<InstanceDeclaration>(); foreach (FilterDeclarationField declaration in filter.Fields) { DataRow row = m_dataset.Tables[0].NewRow(); UpdateRow(row, declaration.InstanceDeclaration); m_dataset.Tables[0].Rows.Add(row); m_declarations.Add(declaration.InstanceDeclaration); } }
/// <summary> /// Deletes the recent history. /// </summary> private void DeleteHistory(NodeId areaId, List <VariantCollection> events, FilterDeclaration filter) { // find the event id. int index = 0; foreach (FilterDeclarationField field in filter.Fields) { if (field.InstanceDeclaration.BrowseName == Opc.Ua.BrowseNames.EventId) { break; } index++; } // can't delete events if no event id. if (index >= filter.Fields.Count) { throw ServiceResultException.Create(StatusCodes.BadEventIdUnknown, "Cannot delete events if EventId was not selected."); } // build list of nodes to delete. DeleteEventDetails details = new DeleteEventDetails(); details.NodeId = areaId; foreach (VariantCollection e in events) { byte[] eventId = null; if (e.Count > index) { eventId = e[index].Value as byte[]; } details.EventIds.Add(eventId); } // delete the events. ExtensionObjectCollection nodesToUpdate = new ExtensionObjectCollection(); nodesToUpdate.Add(new ExtensionObject(details)); HistoryUpdateResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.HistoryUpdate( null, nodesToUpdate, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToUpdate); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToUpdate); if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(results[0].StatusCode); } // check for item level errors. if (results[0].OperationResults.Count > 0) { int count = 0; for (int ii = 0; ii < results[0].OperationResults.Count; ii++) { if (StatusCode.IsBad(results[0].OperationResults[ii])) { count++; } } // raise an error. if (count > 0) { throw ServiceResultException.Create( StatusCodes.BadEventIdUnknown, "Error deleting events. Only {0} of {1} deletes succeeded.", events.Count - count, events.Count); } } }
/// <summary> /// Creates list item for an event. /// </summary> private ListViewItem CreateListItem(FilterDeclaration filter, VariantCollection fieldValues) { ListViewItem item = null; if (m_displayConditions) { NodeId conditionId = fieldValues[0].Value as NodeId; if (conditionId != null) { for (int ii = 0; ii < EventsLV.Items.Count; ii++) { VariantCollection fields = EventsLV.Items[ii].Tag as VariantCollection; if (fields != null && Utils.IsEqual(conditionId, fields[0].Value)) { item = EventsLV.Items[ii]; break; } } } } if (item == null) { item = new ListViewItem(); } item.Tag = fieldValues; int position = -1; for (int ii = 1; ii < filter.Fields.Count; ii++) { if (!filter.Fields[ii].DisplayInList) { continue; } position++; string text = null; Variant value = fieldValues[ii + 1]; // check for missing fields. if (value.Value == null) { text = String.Empty; } // display the name of a node instead of the node id. else if (value.TypeInfo.BuiltInType == BuiltInType.NodeId) { INode node = m_session.NodeCache.Find((NodeId)value.Value); if (node != null) { text = node.ToString(); } } // display local time for any time fields. else if (value.TypeInfo.BuiltInType == BuiltInType.DateTime) { DateTime datetime = (DateTime)value.Value; if (m_filter.Fields[ii].InstanceDeclaration.DisplayName.Contains("Time")) { text = datetime.ToLocalTime().ToString("HH:mm:ss.fff"); } else { text = datetime.ToLocalTime().ToString("yyyy-MM-dd"); } } // use default string format. else { text = value.ToString(); } // update subitem text. if (item.Text == String.Empty) { item.Text = text; item.SubItems[0].Text = text; } else { if (item.SubItems.Count <= position) { item.SubItems.Add(text); } else { item.SubItems[position].Text = text; } } } return item; }
/// <summary> /// Updates the application after connecting to or disconnecting from the server. /// </summary> private void Server_ConnectComplete(object sender, EventArgs e) { try { m_session = ConnectServerCTRL.Session; if (m_session == null) { return; } // set a suitable initial state. if (m_session != null && !m_connectedOnce) { m_connectedOnce = true; EventsLV.IsSubscribed = false; EventsLV.DisplayConditions = true; EventsLV.ChangeArea(Opc.Ua.ObjectIds.Server, false); FilterDeclaration filter = new FilterDeclaration(); ushort namespaceIndex = (ushort)m_session.NamespaceUris.GetIndex(DsatsDemo.Namespaces.DsatsDemo); filter.EventTypeId = ExpandedNodeId.ToNodeId(DsatsDemo.ObjectTypeIds.LockConditionType, m_session.NamespaceUris); filter.AddSimpleField(String.Empty, BuiltInType.NodeId, false); filter.AddSimpleField(Opc.Ua.BrowseNames.EventId, BuiltInType.ByteString, false); filter.AddSimpleField(Opc.Ua.BrowseNames.EventType, BuiltInType.NodeId, false); filter.AddSimpleField(Opc.Ua.BrowseNames.ConditionName, BuiltInType.String, true); filter.AddSimpleField(new QualifiedName[] { new QualifiedName(DsatsDemo.BrowseNames.LockState, namespaceIndex), new QualifiedName(Opc.Ua.BrowseNames.CurrentState) }, BuiltInType.String, ValueRanks.Scalar, true); filter.AddSimpleField(new QualifiedName(DsatsDemo.BrowseNames.ClientUserId, namespaceIndex), BuiltInType.String, true); filter.AddSimpleField(new QualifiedName(DsatsDemo.BrowseNames.SubjectName, namespaceIndex), BuiltInType.String, true); filter.AddSimpleField(new QualifiedName(DsatsDemo.BrowseNames.SessionId, namespaceIndex), BuiltInType.NodeId, true); EventsLV.ChangeFilter(filter, true); m_filter = filter; PhaseCB.Items.Clear(); BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = new NodeId(DsatsDemo.Objects.Rig_Phases, namespaceIndex); nodeToBrowse.ReferenceTypeId = Opc.Ua.ReferenceTypeIds.HierarchicalReferences; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.BrowseDirection = BrowseDirection.Forward; nodeToBrowse.ResultMask = (uint)BrowseResultMask.All; DataValue value = m_session.ReadValue(new NodeId(DsatsDemo.Variables.Rig_CurrentPhase, namespaceIndex)); NodeId currentPhase = value.GetValue <NodeId>(null); ReferenceDescriptionCollection references = ClientUtils.Browse(m_session, nodeToBrowse, false); if (references != null) { for (int ii = 0; ii < references.Count; ii++) { PhaseCB.Items.Add(references[ii]); if (currentPhase == references[ii].NodeId) { PhaseCB.SelectedIndex = ii; } } } m_connectedOnce = true; } EventsLV.IsSubscribed = true; EventsLV.ChangeSession(m_session, true); EventsLV.ConditionRefresh(); } catch (Exception exception) { MessageBox.Show(exception.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error); } }