/// <summary>
        /// Displays a dialog with more detailed view of the current selection.
        /// </summary>
        private void ViewMI_Click(object sender, System.EventArgs e)
        {
            try
            {
                // check for valid selection.
                if (AttributesLV.SelectedItems.Count != 1)
                {
                    return;
                }

                ListViewItem selection = AttributesLV.SelectedItems[0];

                // show values if an attribute collection.
                if (typeof(OpcClientSdk.Hda.TsCHdaAttributeValueCollection).IsInstanceOfType(selection.Tag))
                {
                    new AttributesViewDlg().ShowDialog(m_server, (OpcClientSdk.Hda.TsCHdaAttributeValueCollection)selection.Tag);
                }

                // show description of attribute.
                else if (typeof(OpcClientSdk.Hda.TsCHdaAttribute).IsInstanceOfType(selection.Tag))
                {
                    OpcClientSdk.Hda.TsCHdaAttribute attribute = (OpcClientSdk.Hda.TsCHdaAttribute)selection.Tag;
                    MessageBox.Show(attribute.Description, attribute.Name, MessageBoxButtons.OK);
                }
            }
            catch (Exception exception)
            {
                MessageBox.Show(exception.Message);
            }
        }
        /// <summary>
        /// Displays the dialog until the user enters valid data or clicks cancel.
        /// </summary>
        private TsCHdaBrowseFilter PromptUser()
        {
            while (ShowDialog() == DialogResult.OK)
            {
                try
                {
                    OpcClientSdk.Hda.TsCHdaAttribute attribute = (OpcClientSdk.Hda.TsCHdaAttribute)AttributeCB.SelectedItem;

                    if (attribute == null)
                    {
                        continue;
                    }

                    TsCHdaBrowseFilter filter = new TsCHdaBrowseFilter();

                    filter.AttributeID = attribute.ID;
                    filter.Operator    = (TsCHdaOperator)OperatorCTRL.Value;
                    filter.FilterValue = FilterValueCTRL.Value;

                    return(filter);
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
            }

            return(null);
        }
        /// <summary>
        /// Edits an item from the list.
        /// </summary>
        private void ViewMI_Click(object sender, System.EventArgs e)
        {
            try
            {
                // check for valid selection.
                if (AttributesLV.SelectedItems.Count != 1)
                {
                    return;
                }

                OpcClientSdk.Hda.TsCHdaAttribute attribute = (OpcClientSdk.Hda.TsCHdaAttribute)AttributesLV.SelectedItems[0].Tag;

                // view an attribute.
                MessageBox.Show(attribute.Description, attribute.Name);
            }
            catch (Exception exception)
            {
                MessageBox.Show(exception.Message);
            }
        }
        /// <summary>
        /// Handles a change to the selected attribute.
        /// </summary>
        private void AttributeCB_SelectedIndexChanged(object sender, System.EventArgs e)
        {
            try
            {
                // get current selection.
                OpcClientSdk.Hda.TsCHdaAttribute attribute = (OpcClientSdk.Hda.TsCHdaAttribute)AttributeCB.SelectedItem;

                if (attribute == null)
                {
                    DescriptionLB.Text = "";
                    return;
                }

                // convert filter value to correct data type.
                object value = FilterValueCTRL.Value;

                if (value == null || value.GetType() != attribute.DataType)
                {
                    try
                    {
                        FilterValueCTRL.Value = OpcClientSdk.OpcConvert.ChangeType(value, attribute.DataType);
                    }
                    catch
                    {
                        FilterValueCTRL.Value = OpcClientSdk.OpcConvert.ChangeType(null, attribute.DataType);
                    }
                }

                // update description.
                DescriptionLB.Text = attribute.Description;
            }
            catch (Exception exception)
            {
                MessageBox.Show(exception.Message);
            }
        }
        /// <summary>
        /// Returns the value of the specified field.
        /// </summary>
        private object GetFieldValue(object attribute, int fieldID)
        {
            // display result code.
            if (typeof(IOpcResult).IsInstanceOfType(attribute))
            {
                switch (fieldID)
                {
                case RESULT: { return(((OpcClientSdk.Hda.TsCHdaAttributeValueCollection)attribute).Result); }
                }
            }

            // displaying attribute descriptions.
            if (typeof(OpcClientSdk.Hda.TsCHdaAttribute).IsInstanceOfType(attribute))
            {
                if (AttributesLV.CheckBoxes)
                {
                    switch (fieldID)
                    {
                    case NAME: { return(((OpcClientSdk.Hda.TsCHdaAttribute)attribute).Name); }
                    }
                }
                else
                {
                    switch (fieldID)
                    {
                    case NAME:        { return(((OpcClientSdk.Hda.TsCHdaAttribute)attribute).Name); }

                    case DATA_TYPE:   { return(((OpcClientSdk.Hda.TsCHdaAttribute)attribute).DataType); }

                    case DESCRIPTION: { return(((OpcClientSdk.Hda.TsCHdaAttribute)attribute).Description); }
                    }
                }
            }

            // displaying attribute results.
            if (typeof(OpcClientSdk.Hda.TsCHdaAttributeValueCollection).IsInstanceOfType(attribute))
            {
                OpcClientSdk.Hda.TsCHdaAttributeValueCollection collection = (OpcClientSdk.Hda.TsCHdaAttributeValueCollection)attribute;

                switch (fieldID)
                {
                case NAME:
                {
                    OpcClientSdk.Hda.TsCHdaAttribute description = m_server.Attributes.Find(collection.AttributeID);

                    if (description != null)
                    {
                        return(description.Name);
                    }

                    return(null);
                }

                case NUM_VALUES:
                {
                    if (collection.Count > 1)
                    {
                        return(collection.Count);
                    }

                    return(null);
                }

                case VALUE:
                {
                    if (collection.Count == 1)
                    {
                        return(collection[0].Value);
                    }

                    return(null);
                }
                }
            }

            // displaying attribute values.
            if (typeof(OpcClientSdk.Hda.TsCHdaAttributeValue).IsInstanceOfType(attribute))
            {
                switch (fieldID)
                {
                case TIMESTAMP: { return(((OpcClientSdk.Hda.TsCHdaAttributeValue)attribute).Timestamp); }

                case VALUE:     { return(((OpcClientSdk.Hda.TsCHdaAttributeValue)attribute).Value); }
                }
            }

            return(null);
        }