ArcObjects Library Reference  

AttributeQuery

About the ArcReaderControl attribute query Sample

[C#]

AttributeQuery.cs

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using ESRI.ArcGIS.PublisherControls;

namespace AttributeQuery
{
	/// <summary>
	/// Summary description for Form1.
	/// </summary>
	public class AttributeQuery : System.Windows.Forms.Form
	{
		private AxMSFlexGridLib.AxMSFlexGrid axMSFlexGrid1;
		private AxMSFlexGridLib.AxMSFlexGrid axMSFlexGrid2;
		private System.Windows.Forms.Button cmdMeetZoomTo;
		private System.Windows.Forms.Button cmdMeetCenterAt;
		private System.Windows.Forms.Button cmdMeetFlash;
		private System.Windows.Forms.Button cmdFailZoomTo;
		private System.Windows.Forms.Button cmdFailCenterAt;
		private System.Windows.Forms.Button cmdFailFlash;
		private System.Windows.Forms.Button cmdOpen;
		private System.Windows.Forms.RadioButton optZoomIn;
		private System.Windows.Forms.RadioButton optZoomOut;
		private System.Windows.Forms.RadioButton optPan;
		private System.Windows.Forms.Button cmdFullExtent;
		private System.Windows.Forms.OpenFileDialog openFileDialog1;
		private System.Windows.Forms.GroupBox grpBox;
		private System.Windows.Forms.RadioButton optString;
		private System.Windows.Forms.RadioButton optNumber;
		private System.Windows.Forms.ComboBox cboOperator;
		private System.Windows.Forms.ComboBox cboFields;
		private System.Windows.Forms.ComboBox cboLayers;
		private System.Windows.Forms.TextBox txtValue;
		private System.Windows.Forms.Label lblMeets;
		private System.Windows.Forms.Label lblFails;
		private System.Windows.Forms.Button cmdQuery; 

		private System.Windows.Forms.Label lblLayerToQuery;
		private System.Windows.Forms.Label lblFieldType;
		private System.Windows.Forms.Label lblField;
		private System.Windows.Forms.Label lblOperator;
		private System.Windows.Forms.Label lblValue;


		private System.Collections.Hashtable m_LayersIndex;
		private ARFeatureSet m_arFeatureSetMeets;
		private ARFeatureSet m_arFeatureSetFails;
		private m_InverseOperators[] InverseOperator = new m_InverseOperators[7];
			private ESRI.ArcGIS.PublisherControls.AxArcReaderControl axArcReaderControl1;

		private System.ComponentModel.Container components = null;
		struct m_InverseOperators
		{
			public string input;
			public string inverse;
		}
		public AttributeQuery()
		{
			// Required for Windows Form Designer support
			InitializeComponent();
		}

		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if (components != null) 
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}

		#region Windows Form Designer generated code
		/// <summary>
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// </summary>
		private void InitializeComponent()
		{
				System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(AttributeQuery));
				this.axMSFlexGrid1 = new AxMSFlexGridLib.AxMSFlexGrid();
				this.axMSFlexGrid2 = new AxMSFlexGridLib.AxMSFlexGrid();
				this.cmdMeetZoomTo = new System.Windows.Forms.Button();
				this.cmdMeetCenterAt = new System.Windows.Forms.Button();
				this.cmdMeetFlash = new System.Windows.Forms.Button();
				this.cmdFailZoomTo = new System.Windows.Forms.Button();
				this.cmdFailCenterAt = new System.Windows.Forms.Button();
				this.cmdFailFlash = new System.Windows.Forms.Button();
				this.cmdOpen = new System.Windows.Forms.Button();
				this.optZoomIn = new System.Windows.Forms.RadioButton();
				this.optZoomOut = new System.Windows.Forms.RadioButton();
				this.optPan = new System.Windows.Forms.RadioButton();
				this.cmdFullExtent = new System.Windows.Forms.Button();
				this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
				this.grpBox = new System.Windows.Forms.GroupBox();
				this.lblValue = new System.Windows.Forms.Label();
				this.lblOperator = new System.Windows.Forms.Label();
				this.lblField = new System.Windows.Forms.Label();
				this.lblFieldType = new System.Windows.Forms.Label();
				this.lblLayerToQuery = new System.Windows.Forms.Label();
				this.cmdQuery = new System.Windows.Forms.Button();
				this.txtValue = new System.Windows.Forms.TextBox();
				this.cboLayers = new System.Windows.Forms.ComboBox();
				this.optString = new System.Windows.Forms.RadioButton();
				this.optNumber = new System.Windows.Forms.RadioButton();
				this.cboOperator = new System.Windows.Forms.ComboBox();
				this.cboFields = new System.Windows.Forms.ComboBox();
				this.lblMeets = new System.Windows.Forms.Label();
				this.lblFails = new System.Windows.Forms.Label();
				this.axArcReaderControl1 = new ESRI.ArcGIS.PublisherControls.AxArcReaderControl();
				((System.ComponentModel.ISupportInitialize)(this.axMSFlexGrid1)).BeginInit();
				((System.ComponentModel.ISupportInitialize)(this.axMSFlexGrid2)).BeginInit();
				this.grpBox.SuspendLayout();
				((System.ComponentModel.ISupportInitialize)(this.axArcReaderControl1)).BeginInit();
				this.SuspendLayout();
				// 
				// axMSFlexGrid1
				// 
				this.axMSFlexGrid1.Location = new System.Drawing.Point(8, 384);
				this.axMSFlexGrid1.Name = "axMSFlexGrid1";
				this.axMSFlexGrid1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axMSFlexGrid1.OcxState")));
				this.axMSFlexGrid1.Size = new System.Drawing.Size(344, 104);
				this.axMSFlexGrid1.TabIndex = 0;
				// 
				// axMSFlexGrid2
				// 
				this.axMSFlexGrid2.Location = new System.Drawing.Point(360, 384);
				this.axMSFlexGrid2.Name = "axMSFlexGrid2";
				this.axMSFlexGrid2.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axMSFlexGrid2.OcxState")));
				this.axMSFlexGrid2.Size = new System.Drawing.Size(344, 104);
				this.axMSFlexGrid2.TabIndex = 1;
				// 
				// cmdMeetZoomTo
				// 
				this.cmdMeetZoomTo.Location = new System.Drawing.Point(8, 488);
				this.cmdMeetZoomTo.Name = "cmdMeetZoomTo";
				this.cmdMeetZoomTo.Size = new System.Drawing.Size(112, 24);
				this.cmdMeetZoomTo.TabIndex = 3;
				this.cmdMeetZoomTo.Text = "Zoom To";
				this.cmdMeetZoomTo.Click += new System.EventHandler(this.MixedDisplayResults_Click);
				// 
				// cmdMeetCenterAt
				// 
				this.cmdMeetCenterAt.Location = new System.Drawing.Point(128, 488);
				this.cmdMeetCenterAt.Name = "cmdMeetCenterAt";
				this.cmdMeetCenterAt.Size = new System.Drawing.Size(112, 24);
				this.cmdMeetCenterAt.TabIndex = 4;
				this.cmdMeetCenterAt.Text = "Center At";
				this.cmdMeetCenterAt.Click += new System.EventHandler(this.MixedDisplayResults_Click);
				// 
				// cmdMeetFlash
				// 
				this.cmdMeetFlash.Location = new System.Drawing.Point(248, 488);
				this.cmdMeetFlash.Name = "cmdMeetFlash";
				this.cmdMeetFlash.Size = new System.Drawing.Size(104, 24);
				this.cmdMeetFlash.TabIndex = 5;
				this.cmdMeetFlash.Text = "Flash";
				this.cmdMeetFlash.Click += new System.EventHandler(this.MixedDisplayResults_Click);
				// 
				// cmdFailZoomTo
				// 
				this.cmdFailZoomTo.Location = new System.Drawing.Point(360, 488);
				this.cmdFailZoomTo.Name = "cmdFailZoomTo";
				this.cmdFailZoomTo.Size = new System.Drawing.Size(112, 24);
				this.cmdFailZoomTo.TabIndex = 6;
				this.cmdFailZoomTo.Text = "Zoom To";
				this.cmdFailZoomTo.Click += new System.EventHandler(this.MixedDisplayResults_Click);
				// 
				// cmdFailCenterAt
				// 
				this.cmdFailCenterAt.Location = new System.Drawing.Point(480, 488);
				this.cmdFailCenterAt.Name = "cmdFailCenterAt";
				this.cmdFailCenterAt.Size = new System.Drawing.Size(112, 24);
				this.cmdFailCenterAt.TabIndex = 7;
				this.cmdFailCenterAt.Text = "Center At";
				this.cmdFailCenterAt.Click += new System.EventHandler(this.MixedDisplayResults_Click);
				// 
				// cmdFailFlash
				// 
				this.cmdFailFlash.Location = new System.Drawing.Point(600, 488);
				this.cmdFailFlash.Name = "cmdFailFlash";
				this.cmdFailFlash.Size = new System.Drawing.Size(104, 24);
				this.cmdFailFlash.TabIndex = 8;
				this.cmdFailFlash.Text = "Flash";
				this.cmdFailFlash.Click += new System.EventHandler(this.MixedDisplayResults_Click);
				// 
				// cmdOpen
				// 
				this.cmdOpen.Location = new System.Drawing.Point(8, 8);
				this.cmdOpen.Name = "cmdOpen";
				this.cmdOpen.Size = new System.Drawing.Size(72, 24);
				this.cmdOpen.TabIndex = 9;
				this.cmdOpen.Text = "Open";
				this.cmdOpen.Click += new System.EventHandler(this.cmdOpen_Click);
				// 
				// optZoomIn
				// 
				this.optZoomIn.Appearance = System.Windows.Forms.Appearance.Button;
				this.optZoomIn.Location = new System.Drawing.Point(80, 8);
				this.optZoomIn.Name = "optZoomIn";
				this.optZoomIn.Size = new System.Drawing.Size(72, 24);
				this.optZoomIn.TabIndex = 10;
				this.optZoomIn.Text = "Zoom In";
				this.optZoomIn.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
				this.optZoomIn.Click += new System.EventHandler(this.MixedControls_Click);
				// 
				// optZoomOut
				// 
				this.optZoomOut.Appearance = System.Windows.Forms.Appearance.Button;
				this.optZoomOut.Location = new System.Drawing.Point(152, 8);
				this.optZoomOut.Name = "optZoomOut";
				this.optZoomOut.Size = new System.Drawing.Size(72, 24);
				this.optZoomOut.TabIndex = 11;
				this.optZoomOut.Text = "Zoom Out";
				this.optZoomOut.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
				this.optZoomOut.Click += new System.EventHandler(this.MixedControls_Click);
				// 
				// optPan
				// 
				this.optPan.Appearance = System.Windows.Forms.Appearance.Button;
				this.optPan.Location = new System.Drawing.Point(296, 8);
				this.optPan.Name = "optPan";
				this.optPan.Size = new System.Drawing.Size(72, 24);
				this.optPan.TabIndex = 13;
				this.optPan.Text = "Pan";
				this.optPan.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
				this.optPan.Click += new System.EventHandler(this.MixedControls_Click);
				// 
				// cmdFullExtent
				// 
				this.cmdFullExtent.Location = new System.Drawing.Point(224, 8);
				this.cmdFullExtent.Name = "cmdFullExtent";
				this.cmdFullExtent.Size = new System.Drawing.Size(72, 24);
				this.cmdFullExtent.TabIndex = 14;
				this.cmdFullExtent.Text = "Full Extent";
				this.cmdFullExtent.Click += new System.EventHandler(this.cmdFullExtent_Click);
				// 
				// grpBox
				// 
				this.grpBox.Controls.Add(this.lblValue);
				this.grpBox.Controls.Add(this.lblOperator);
				this.grpBox.Controls.Add(this.lblField);
				this.grpBox.Controls.Add(this.lblFieldType);
				this.grpBox.Controls.Add(this.lblLayerToQuery);
				this.grpBox.Controls.Add(this.cmdQuery);
				this.grpBox.Controls.Add(this.txtValue);
				this.grpBox.Controls.Add(this.cboLayers);
				this.grpBox.Controls.Add(this.optString);
				this.grpBox.Controls.Add(this.optNumber);
				this.grpBox.Controls.Add(this.cboOperator);
				this.grpBox.Controls.Add(this.cboFields);
				this.grpBox.Location = new System.Drawing.Point(560, 40);
				this.grpBox.Name = "grpBox";
				this.grpBox.Size = new System.Drawing.Size(144, 312);
				this.grpBox.TabIndex = 20;
				this.grpBox.TabStop = false;
				this.grpBox.Text = "Query Criteria";
				// 
				// lblValue
				// 
				this.lblValue.Location = new System.Drawing.Point(8, 224);
				this.lblValue.Name = "lblValue";
				this.lblValue.Size = new System.Drawing.Size(120, 16);
				this.lblValue.TabIndex = 31;
				this.lblValue.Text = "Value:";
				// 
				// lblOperator
				// 
				this.lblOperator.Location = new System.Drawing.Point(8, 176);
				this.lblOperator.Name = "lblOperator";
				this.lblOperator.Size = new System.Drawing.Size(88, 16);
				this.lblOperator.TabIndex = 30;
				this.lblOperator.Text = "Operator:";
				// 
				// lblField
				// 
				this.lblField.Location = new System.Drawing.Point(8, 128);
				this.lblField.Name = "lblField";
				this.lblField.Size = new System.Drawing.Size(96, 16);
				this.lblField.TabIndex = 29;
				this.lblField.Text = "Field to Query:";
				// 
				// lblFieldType
				// 
				this.lblFieldType.Location = new System.Drawing.Point(8, 80);
				this.lblFieldType.Name = "lblFieldType";
				this.lblFieldType.Size = new System.Drawing.Size(104, 16);
				this.lblFieldType.TabIndex = 28;
				this.lblFieldType.Text = "Field Type:";
				// 
				// lblLayerToQuery
				// 
				this.lblLayerToQuery.Location = new System.Drawing.Point(8, 24);
				this.lblLayerToQuery.Name = "lblLayerToQuery";
				this.lblLayerToQuery.Size = new System.Drawing.Size(120, 16);
				this.lblLayerToQuery.TabIndex = 27;
				this.lblLayerToQuery.Text = "Layer to Query:";
				// 
				// cmdQuery
				// 
				this.cmdQuery.Location = new System.Drawing.Point(24, 272);
				this.cmdQuery.Name = "cmdQuery";
				this.cmdQuery.Size = new System.Drawing.Size(104, 32);
				this.cmdQuery.TabIndex = 26;
				this.cmdQuery.Text = "Query";
				this.cmdQuery.Click += new System.EventHandler(this.cmdQuery_Click);
				// 
				// txtValue
				// 
				this.txtValue.Location = new System.Drawing.Point(8, 240);
				this.txtValue.Name = "txtValue";
				this.txtValue.Size = new System.Drawing.Size(120, 20);
				this.txtValue.TabIndex = 25;
				this.txtValue.Text = "";
				this.txtValue.TextChanged += new System.EventHandler(this.txtValue_TextChanged);
				// 
				// cboLayers
				// 
				this.cboLayers.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
				this.cboLayers.Location = new System.Drawing.Point(8, 40);
				this.cboLayers.Name = "cboLayers";
				this.cboLayers.Size = new System.Drawing.Size(120, 21);
				this.cboLayers.TabIndex = 24;
				this.cboLayers.SelectedIndexChanged += new System.EventHandler(this.cboLayers_SelectedIndexChanged);
				// 
				// optString
				// 
				this.optString.Location = new System.Drawing.Point(80, 96);
				this.optString.Name = "optString";
				this.optString.Size = new System.Drawing.Size(56, 16);
				this.optString.TabIndex = 23;
				this.optString.Text = "String";
				this.optString.Click += new System.EventHandler(this.DataType_Click);
				// 
				// optNumber
				// 
				this.optNumber.Location = new System.Drawing.Point(8, 96);
				this.optNumber.Name = "optNumber";
				this.optNumber.Size = new System.Drawing.Size(64, 16);
				this.optNumber.TabIndex = 22;
				this.optNumber.Text = "Number";
				this.optNumber.Click += new System.EventHandler(this.DataType_Click);
				// 
				// cboOperator
				// 
				this.cboOperator.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
				this.cboOperator.Location = new System.Drawing.Point(8, 192);
				this.cboOperator.Name = "cboOperator";
				this.cboOperator.Size = new System.Drawing.Size(120, 21);
				this.cboOperator.TabIndex = 21;
				// 
				// cboFields
				// 
				this.cboFields.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
				this.cboFields.Location = new System.Drawing.Point(8, 144);
				this.cboFields.Name = "cboFields";
				this.cboFields.Size = new System.Drawing.Size(120, 21);
				this.cboFields.TabIndex = 20;
				// 
				// lblMeets
				// 
				this.lblMeets.Location = new System.Drawing.Point(8, 360);
				this.lblMeets.Name = "lblMeets";
				this.lblMeets.Size = new System.Drawing.Size(344, 24);
				this.lblMeets.TabIndex = 21;
				// 
				// lblFails
				// 
				this.lblFails.Location = new System.Drawing.Point(368, 360);
				this.lblFails.Name = "lblFails";
				this.lblFails.Size = new System.Drawing.Size(336, 24);
				this.lblFails.TabIndex = 22;
				// 
				// axArcReaderControl1
				// 
				this.axArcReaderControl1.Location = new System.Drawing.Point(8, 40);
				this.axArcReaderControl1.Name = "axArcReaderControl1";
				this.axArcReaderControl1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axArcReaderControl1.OcxState")));
				this.axArcReaderControl1.Size = new System.Drawing.Size(544, 312);
				this.axArcReaderControl1.TabIndex = 23;
				// 
				// AttributeQuery
				// 
				this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
				this.ClientSize = new System.Drawing.Size(712, 517);
				this.Controls.Add(this.axArcReaderControl1);
				this.Controls.Add(this.lblFails);
				this.Controls.Add(this.lblMeets);
				this.Controls.Add(this.grpBox);
				this.Controls.Add(this.cmdFullExtent);
				this.Controls.Add(this.optPan);
				this.Controls.Add(this.optZoomOut);
				this.Controls.Add(this.optZoomIn);
				this.Controls.Add(this.cmdOpen);
				this.Controls.Add(this.cmdFailFlash);
				this.Controls.Add(this.cmdFailCenterAt);
				this.Controls.Add(this.cmdFailZoomTo);
				this.Controls.Add(this.cmdMeetFlash);
				this.Controls.Add(this.cmdMeetCenterAt);
				this.Controls.Add(this.cmdMeetZoomTo);
				this.Controls.Add(this.axMSFlexGrid2);
				this.Controls.Add(this.axMSFlexGrid1);
				this.Name = "AttributeQuery";
				this.Text = "AttributeQuery (LesserThan / GreaterThan) ";
				this.Load += new System.EventHandler(this.AttributeQuery_Load);
				((System.ComponentModel.ISupportInitialize)(this.axMSFlexGrid1)).EndInit();
				((System.ComponentModel.ISupportInitialize)(this.axMSFlexGrid2)).EndInit();
				this.grpBox.ResumeLayout(false);
				((System.ComponentModel.ISupportInitialize)(this.axArcReaderControl1)).EndInit();
				this.ResumeLayout(false);

		}
		#endregion

		[STAThread]
		static void Main() 
		{
            if (!ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.ArcReader))
            {
                if (!ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop))
                {
                    MessageBox.Show("Unable to bind to ArcGIS runtime. Application will be shut down.");
                    return;
                }
            }

            Application.Run(new AttributeQuery());
		}

		private void AttributeQuery_Load(object sender, System.EventArgs e)
		{
			//Disable Search Tools
			EnableSearchTools(false);
			EnableMapTools(false);
			EnableMeetHighlightTools(false);
			EnableFailHighlightTools(false);

			//Populate Inverse Operators array
			PopulateInverseOperators();

			optNumber.Checked=true;
		}	

		private void MixedControls_Click(object sender, System.EventArgs e)
		{
			//Added handler in InitializeComponent() for OptionButtons

			RadioButton b = (RadioButton) sender;
			//Set current tool
			switch (b.Name)
			{
				case "optZoomIn":
					axArcReaderControl1.CurrentARTool = esriARTool.esriARToolMapZoomIn;
					break;
				case "optZoomOut":
					axArcReaderControl1.CurrentARTool = esriARTool.esriARToolMapZoomOut;
					break;
				case "optPan":
					axArcReaderControl1.CurrentARTool = esriARTool.esriARToolMapPan;
					break;
			}
		}
		private void MixedDisplayResults_Click(object sender, System.EventArgs e)
		{
			//Added handler in InitializeComponent() for OptionButtons

			Button b = (Button) sender;
			//Set current tool
			switch (b.Name)
			{
				case "cmdMeetZoomTo":
					m_arFeatureSetMeets.ZoomTo();
					break;
				case "cmdMeetCenterAt":
					m_arFeatureSetMeets.CenterAt();
					break;
				case "cmdMeetFlash":
					m_arFeatureSetMeets.Flash();
					break;
				case "cmdFailZoomTo":
					m_arFeatureSetFails.ZoomTo();
					break;
				case "cmdFailCenterAt":
					m_arFeatureSetFails.CenterAt();
					break;
				case "cmdFailFlash":
					m_arFeatureSetFails.Flash();
					break;
			}
		}
		private void DataType_Click(object sender, System.EventArgs e)
		{
			//Added handler in InitializeComponent() for OptionButtons
				
			RadioButton b = (RadioButton) sender;
			//Set current tool
			switch (b.Name)
			{
				case "optNumber":
					PopulateFields(false);
					PopulateOperators(false);
					break;
				case "optString":
					PopulateFields(true);
					PopulateOperators(true);
					break;
			}
		}
		private void cmdFullExtent_Click(object sender, System.EventArgs e)
		{
			axArcReaderControl1.ARPageLayout.FocusARMap.ZoomToFullExtent();
		}
		private void cmdOpen_Click(object sender, System.EventArgs e)
		{
			//Open a file dialog for selecting map documents
			openFileDialog1.Title = "Select Published Map Document";
			openFileDialog1.Filter = "Published Map Documents (*.pmf)|*.pmf";
			openFileDialog1.ShowDialog();

			//Exit if no map document is selected
			string sFilePath = openFileDialog1.FileName;
			if (sFilePath == "") return;

			//Load the specified pmf
			if (axArcReaderControl1.CheckDocument(sFilePath) == true)
			{
				axArcReaderControl1.LoadDocument(sFilePath,"");
			}
			else
			{
				System.Windows.Forms.MessageBox.Show("This document cannot be loaded!");
				return;
			}

			 //Disable search  & map tools
			cboLayers.Items.Clear();
			cboFields.Items.Clear();
			EnableSearchTools (false);
			EnableMeetHighlightTools (false);
			EnableFailHighlightTools (false);
			
			//Determine whether permission to search layers and query field values
			bool bqueryFeatures = axArcReaderControl1.HasDocumentPermission(esriARDocumentPermissions.esriARDocumentPermissionsQueryFeatures);
			bool bqueryValues = axArcReaderControl1.HasDocumentPermission(esriARDocumentPermissions.esriARDocumentPermissionsQueryValues);

			if (bqueryFeatures==false || bqueryValues==false)
			{
				System.Windows.Forms.MessageBox.Show("The selected Document does not have Query Permissions.");
				return;
			}

			//Add map layers to combo and store in HashTable with combo index
			m_LayersIndex = new Hashtable();
			ARPopulateComboWithMapLayers(cboLayers, m_LayersIndex);

			//Select first searchable layer
			for(int i=0;  i <= cboLayers.Items.Count-1; i++)
			{
				ARLayer arLayer = (ARLayer)m_LayersIndex[i];
				if (arLayer.Searchable==true)
				{
					cboLayers.SelectedIndex=i;
					break;
				}
			}

			//Enable Search & Map Tools
			EnableSearchTools(true);
			EnableMapTools(true);
		}
		private void ARPopulateComboWithMapLayers(ComboBox Layers, System.Collections.Hashtable LayersIndex)
		{
			//In case cboLayers is already populated
			Layers.Items.Clear();
			LayersIndex.Clear();

			ARLayer arLayer;
			ARLayer arGroupLayer;
			
			// Get the focus map
			ARMap arMap = axArcReaderControl1.ARPageLayout.FocusARMap;

			// Loop through each layer in the focus map
			for (int i=0; i <= arMap.ARLayerCount-1; i++)
			{
				// Get the layer name and add to combo
				arLayer = arMap.get_ARLayer(i);
				if (arLayer.IsGroupLayer == true)
				{
					//If a GroupLayer add the ARChildLayers to the combo and HashTable
					for (int g=0; g <= arLayer.ARLayerCount-1; g++)
					{
						arGroupLayer = arMap.get_ARLayer(i).get_ChildARLayer(g);
						Layers.Items.Add(arGroupLayer.Name);
						LayersIndex.Add(Layers.Items.Count-1,arGroupLayer);
					}
				}
				else if (arLayer.Searchable==true)
				{
					Layers.Items.Add(arLayer.Name);
					LayersIndex.Add(Layers.Items.Count-1,arLayer);
				}
			}
		}
		private void PopulateFields(bool bIsStringField)
		{
			try 
			{
				// Clear all items in fields combo
				cboFields.Items.Clear();
				ARLayer arLayer = (ARLayer)m_LayersIndex[cboLayers.SelectedIndex];
				ArcReaderSearchDef arSearchDef = new ArcReaderSearchDefClass();
				ARFeatureCursor arFeatureCursor = arLayer.SearchARFeatures(arSearchDef);
			
				// Get the first feature in order to access the field names
				ARFeature arFeature = arFeatureCursor.NextARFeature();
        
				// Loop through fields and add field names to combo
				int i;
				i = 0;
				while (i <  arFeature.FieldCount)
				{
					if (bIsStringField ==  true)
					{
						if (arFeature.get_FieldType(i) ==  esriARFieldType.esriARFieldTypeString)
						{
							cboFields.Items.Add(arFeature.get_FieldName(i));
						}
					}
					else
					{
						if ((arFeature.get_FieldType(i) ==  esriARFieldType.esriARFieldTypeDouble) ||  (arFeature.get_FieldType(i) ==  esriARFieldType.esriARFieldTypeInteger) ||  (arFeature.get_FieldType(i) ==  esriARFieldType.esriARFieldTypeSingle) ||  (arFeature.get_FieldType(i) ==  esriARFieldType.esriARFieldTypeSmallInteger) ||  (arFeature.get_FieldType(i) ==  esriARFieldType.esriARFieldTypeOID))
						{
							cboFields.Items.Add(arFeature.get_FieldName(i));
						}
					}
				
					i = i+ 1;

					if(cboFields.Items.Count != 0)
					{
						cboFields.SelectedIndex=0;
					}
				};
			}
			catch 
			{
				MessageBox.Show("An error occurred populating the Field ComboBox.");
			}
		}
		private void PopulateOperators(bool bIsStringField)
		{
			// Clear any current values from combo
			cboOperator.Items.Clear();

			if (bIsStringField ==  true)
			{
				cboOperator.Items.Insert(0, "=");
				cboOperator.Items.Insert(1, "<>");
			}
			else
			{
				cboOperator.Items.Insert(0, "=");
				cboOperator.Items.Insert(1, "<>");
				cboOperator.Items.Insert(2, ">");
				cboOperator.Items.Insert(3, ">=");
				cboOperator.Items.Insert(4, "<=");
				cboOperator.Items.Insert(5, "<");
			}

			cboOperator.SelectedIndex = 0;

		}
		private void PopulateInverseOperators()
		{
			InverseOperator[0].input = "=";
			InverseOperator[0].inverse = "<>";
			InverseOperator[1].input = "<>";
			InverseOperator[1].inverse = "=";
			InverseOperator[2].input = ">";
			InverseOperator[2].inverse = "<=";
			InverseOperator[3].input = ">=";
			InverseOperator[3].inverse = "<";
			InverseOperator[4].input = "<=";
			InverseOperator[4].inverse = ">";
			InverseOperator[5].input = "<";
			InverseOperator[5].inverse = ">=";
		}
		private void EnableSearchTools(bool EnabledState)
		{	
			txtValue.Text = "";
			optNumber.Enabled = EnabledState;
			optString.Enabled = EnabledState;
			cboFields.Enabled = EnabledState;
			cboOperator.Enabled = EnabledState;
			txtValue.Enabled = EnabledState;
			cmdQuery.Enabled = EnabledState;
		}
		private void EnableMapTools(bool EnabledState)
		{	
			optZoomIn.Enabled = EnabledState;
			optZoomOut.Enabled = EnabledState;
			optPan.Enabled = EnabledState;
			cmdFullExtent.Enabled = EnabledState;
		}
		private void EnableMeetHighlightTools(bool EnabledState)
		{	
			cmdMeetFlash.Enabled = EnabledState;
			cmdMeetZoomTo.Enabled = EnabledState;
			cmdMeetCenterAt.Enabled = EnabledState;
		}
		private void EnableFailHighlightTools(bool EnabledState)
		{	
			cmdFailFlash.Enabled = EnabledState;
			cmdFailZoomTo.Enabled = EnabledState;
			cmdFailCenterAt.Enabled = EnabledState;
		}
		private void cboLayers_SelectedIndexChanged(object sender, System.EventArgs e)
		{
			ARLayer arLayer = (ARLayer)m_LayersIndex[cboLayers.SelectedIndex];
			//Check if layer can be searched
			if (arLayer.Searchable)
			{
				EnableSearchTools(true);
				PopulateFields(optString.Checked);
				PopulateOperators(optString.Checked);
			}
			else
			{
				MessageBox.Show("The Layer you have selected is not Searchable.");
				EnableSearchTools(false);
			}

			//Clear Grids, Labels and disable display tools
			axMSFlexGrid1.Clear();
			axMSFlexGrid2.Clear();
			lblMeets.Text="";
			lblFails.Text="";
			EnableMeetHighlightTools(false);
			EnableFailHighlightTools(false);
		}
		private void cmdQuery_Click(object sender, System.EventArgs e)
		{
			//Set mouse cursor as this can take some time with large datasets
			Cursor.Current = Cursors.WaitCursor;

			//Check value has been entered in field combo
			if (cboFields.Text == "")
			{
				System.Windows.Forms.MessageBox.Show("You have not selected a field.");
				Cursor.Current = Cursors.Default;
				return;
			}

			//Check value has been entered in operator combo
			if (cboOperator.Text == "")
			{
				System.Windows.Forms.MessageBox.Show("You have not selected an operator.");
				Cursor.Current = Cursors.Default;
				return;
			}

			//Check value has been entered in value textbox
			if (txtValue.Text == "")
			{
				System.Windows.Forms.MessageBox.Show("You have not entered a query value.");
				txtValue.Focus();
				Cursor.Current = Cursors.Default;
				return;
			}

			//Get layer to query
			ARMap arMap = axArcReaderControl1.ARPageLayout.FocusARMap;

			ARLayer arLayer = (ARLayer)m_LayersIndex[cboLayers.SelectedIndex];
	
			//Build the ARSearchDef
			ArcReaderSearchDef arSearchDef = new ArcReaderSearchDefClass();

			//Build WhereClause that meets search criteria
			string sWhereClause;

			//Remove quotes from WhereClause if search is numeric
			if (optNumber.Checked == true)
			{
				sWhereClause = cboFields.Text + " " + cboOperator.Text + " " + txtValue.Text;
			}
			else
			{
				sWhereClause = cboFields.Text + " " + cboOperator.Text + " '" + txtValue.Text + "'";
			}

			arSearchDef.WhereClause = sWhereClause;

			//Get ARFeatureSet that meets the search criteria
			m_arFeatureSetMeets = arLayer.QueryARFeatures(arSearchDef);

			//Build WhereClause that fails search criteria
			//Remove quotes from WhereClause if search is numeric
			if (optNumber.Checked == true)
			{
				sWhereClause = cboFields.Text + " " + InverseOperator[cboOperator.SelectedIndex].inverse.ToString() + " " + txtValue.Text;
			}
			else
			{
				sWhereClause = cboFields.Text + " " + InverseOperator[cboOperator.SelectedIndex].inverse.ToString() + " '" + txtValue.Text + "'";
			}

			arSearchDef.WhereClause = sWhereClause;

			//Get ARFeatureSet that fails search criteria
			m_arFeatureSetFails = arLayer.QueryARFeatures(arSearchDef);

			//Reset mouse cursor
			Cursor.Current = Cursors.Default;

			//Populate the FlexGrid Controls with the ARFeatureSets
			PopulateFlexGrids(axMSFlexGrid1, m_arFeatureSetMeets);
			PopulateFlexGrids(axMSFlexGrid2, m_arFeatureSetFails);
		

			//Give the user some feedback regarding the number of features that meet criteria
			if (m_arFeatureSetMeets.ARFeatureCount > 0)
			{ 
				EnableMeetHighlightTools(true);
				lblMeets.Text = "Features MEETING the search criteria: " + m_arFeatureSetMeets.ARFeatureCount.ToString();
			}
			else
			{
				EnableMeetHighlightTools(false);
				axMSFlexGrid1.Clear();
				lblMeets.Text = "Features MEETING the search criteria: 0";
			}

			if (m_arFeatureSetFails.ARFeatureCount > 0)
			{
				EnableFailHighlightTools(true);
				lblFails.Text = "Features FAILING the search criteria: " + m_arFeatureSetFails.ARFeatureCount.ToString();
			}
			else
			{
				EnableFailHighlightTools(false);
				axMSFlexGrid2.Clear();
				lblMeets.Text = "Features FAILING the search criteria: 0";
			}

		}
		private void PopulateFlexGrids(AxMSFlexGridLib.AxMSFlexGrid pFlexGrid, ARFeatureSet arFeatureSet)
		{
			//Get first feature in ARFeatureSet
			arFeatureSet.Reset();
			ARFeature arFeature = arFeatureSet.Next();

			//Exit if no features in set
			if (arFeature == null)
			{
				return;
			}

			//Change cursor while grid populates
			Cursor = Cursors.WaitCursor;

			//Clear Grid of any existing data
			pFlexGrid.Clear();

			//Reset the Grid dimensions
			pFlexGrid.Rows = arFeatureSet.ARFeatureCount + 2;
			pFlexGrid.Cols = arFeature.FieldCount + 1;

			int c = 1;
			int r = 1;

			//Loop through and add field names
			while (c < arFeature.FieldCount + 1)
			{
				pFlexGrid.Row = 0;
				pFlexGrid.Col = c;
				pFlexGrid.Text = arFeature.get_FieldName(c - 1);
				c = c + 1;
			}

			//Reset Col Counter
			c = 1;

			//Populate Grid
			while (r < arFeatureSet.ARFeatureCount + 1)
			{
				pFlexGrid.Row = r;

				while (c < arFeature.FieldCount + 1)
				{
					pFlexGrid.Col = c;
					pFlexGrid.Text = ARFeatureValueAsString(arFeature, c - 1);
					c++;
				}
				//Reset Column
				c = 1;
				//Move to next Row
				r = r + 1;
				//Move to next Feature in the FeatureSet
				arFeature = arFeatureSet.Next();
			}
			//Reset mouse cursor
			Cursor = Cursors.Default;
		}
		private string ARFeatureValueAsString(ARFeature pARFeature, int pFieldNameIndex)
		{
			// If there is an issue accessing the value the function returns a string of asterisks
			// There are many reason Asterisks may be returned...
			// The return value cant be cast into a string e.g. a BLOB value
			// The return value is stored within a hidden field in the PMF
			// The return value is a Geometry Object
			try
			{
				string pARFeatureValueAsString = pARFeature.get_Value(pARFeature.get_FieldName(pFieldNameIndex)).ToString();
				return pARFeatureValueAsString;	
			}
			catch
			{
				string pARFeatureValueAsString = "***";
				return pARFeatureValueAsString;	
			}
		}
		public static bool IsDecimal(string theValue)
		{
			//A function to mimic the VB.NET VB6 function Is Numeric
			try
			{
				Convert.ToDouble(theValue);
				return true;
			} 
			catch 
			{
				return false;
			}
		}
		private void txtValue_TextChanged(object sender, System.EventArgs e)
		{
			//Prevent user entering no numeric value if querying numeric field
			if (optNumber.Checked==true)
			{
				if (IsDecimal(txtValue.Text) == false)
				{
					txtValue.Clear();
				}
			}
		}
	}
}

[Visual Basic .NET]

AttributeQuery.vb

Imports ESRI.ArcGIS.PublisherControls
Imports ESRI.ArcGIS
Imports System.Collections


Public Class AttributeQuery
  Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

  Public Sub New()
    MyBase.New()

        'Load runtime 
        If Not RuntimeManager.Bind(ProductCode.ArcReader) Then
            If Not RuntimeManager.Bind(ProductCode.EngineOrDesktop) Then
                MessageBox.Show("Unable to bind to ArcGIS runtime. Application will be shut down.")
                System.Environment.Exit(1) ' Force exit 
            End If
        End If

    'This call is required by the Windows Form Designer.
    InitializeComponent()

    'Add any initialization after the InitializeComponent() call

  End Sub

  'Form overrides dispose to clean up the component list.
  Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
    If disposing Then
      If Not (components Is Nothing) Then
        components.Dispose()
      End If
    End If
    MyBase.Dispose(disposing)
  End Sub

  'Required by the Windows Form Designer
  Private components As System.ComponentModel.IContainer

  'NOTE: The following procedure is required by the Windows Form Designer
  'It can be modified using the Windows Form Designer.  
  'Do not modify it using the code editor.
  Friend WithEvents grpBox As System.Windows.Forms.GroupBox
  Friend WithEvents lblValue As System.Windows.Forms.Label
  Friend WithEvents lblOperator As System.Windows.Forms.Label
  Friend WithEvents lblField As System.Windows.Forms.Label
  Friend WithEvents lblFieldType As System.Windows.Forms.Label
  Friend WithEvents lblLayerToQuery As System.Windows.Forms.Label
  Friend WithEvents cmdQuery As System.Windows.Forms.Button
  Friend WithEvents txtValue As System.Windows.Forms.TextBox
  Friend WithEvents cboLayers As System.Windows.Forms.ComboBox
  Friend WithEvents optString As System.Windows.Forms.RadioButton
  Friend WithEvents optNumber As System.Windows.Forms.RadioButton
  Friend WithEvents cboOperator As System.Windows.Forms.ComboBox
  Friend WithEvents cboFields As System.Windows.Forms.ComboBox
  Friend WithEvents cmdFullExtent As System.Windows.Forms.Button
  Friend WithEvents cmdFailCenterAt As System.Windows.Forms.Button
  Friend WithEvents cmdMeetCenterAt As System.Windows.Forms.Button
  Friend WithEvents cmdMeetZoomTo As System.Windows.Forms.Button
  Friend WithEvents lblFails As System.Windows.Forms.Label
  Friend WithEvents optPan As System.Windows.Forms.RadioButton
  Friend WithEvents optZoomOut As System.Windows.Forms.RadioButton
  Friend WithEvents optZoomIn As System.Windows.Forms.RadioButton
  Friend WithEvents cmdFailZoomTo As System.Windows.Forms.Button
  Friend WithEvents cmdMeetFlash As System.Windows.Forms.Button
  Friend WithEvents lblMeets As System.Windows.Forms.Label
  Friend WithEvents cmdOpen As System.Windows.Forms.Button
  Friend WithEvents cmdFailFlash As System.Windows.Forms.Button
  Friend WithEvents AxMSFlexGrid1 As AxMSFlexGridLib.AxMSFlexGrid
  Friend WithEvents AxMSFlexGrid2 As AxMSFlexGridLib.AxMSFlexGrid
  Friend WithEvents OpenFileDialog1 As System.Windows.Forms.OpenFileDialog
  Friend WithEvents AxArcReaderControl1 As ESRI.ArcGIS.PublisherControls.AxArcReaderControl
  <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
    Dim resources As System.Resources.ResourceManager = New System.Resources.ResourceManager(GetType(AttributeQuery))
    Me.grpBox = New System.Windows.Forms.GroupBox
    Me.lblValue = New System.Windows.Forms.Label
    Me.lblOperator = New System.Windows.Forms.Label
    Me.lblField = New System.Windows.Forms.Label
    Me.lblFieldType = New System.Windows.Forms.Label
    Me.lblLayerToQuery = New System.Windows.Forms.Label
    Me.cmdQuery = New System.Windows.Forms.Button
    Me.txtValue = New System.Windows.Forms.TextBox
    Me.cboLayers = New System.Windows.Forms.ComboBox
    Me.optString = New System.Windows.Forms.RadioButton
    Me.optNumber = New System.Windows.Forms.RadioButton
    Me.cboOperator = New System.Windows.Forms.ComboBox
    Me.cboFields = New System.Windows.Forms.ComboBox
    Me.cmdFullExtent = New System.Windows.Forms.Button
    Me.cmdFailCenterAt = New System.Windows.Forms.Button
    Me.cmdMeetCenterAt = New System.Windows.Forms.Button
    Me.cmdMeetZoomTo = New System.Windows.Forms.Button
    Me.lblFails = New System.Windows.Forms.Label
    Me.optPan = New System.Windows.Forms.RadioButton
    Me.optZoomOut = New System.Windows.Forms.RadioButton
    Me.optZoomIn = New System.Windows.Forms.RadioButton
    Me.cmdFailZoomTo = New System.Windows.Forms.Button
    Me.cmdMeetFlash = New System.Windows.Forms.Button
    Me.lblMeets = New System.Windows.Forms.Label
    Me.cmdOpen = New System.Windows.Forms.Button
    Me.cmdFailFlash = New System.Windows.Forms.Button
    Me.AxMSFlexGrid1 = New AxMSFlexGridLib.AxMSFlexGrid
    Me.AxMSFlexGrid2 = New AxMSFlexGridLib.AxMSFlexGrid
    Me.OpenFileDialog1 = New System.Windows.Forms.OpenFileDialog
    Me.AxArcReaderControl1 = New ESRI.ArcGIS.PublisherControls.AxArcReaderControl
    Me.grpBox.SuspendLayout()
    CType(Me.AxMSFlexGrid1, System.ComponentModel.ISupportInitialize).BeginInit()
    CType(Me.AxMSFlexGrid2, System.ComponentModel.ISupportInitialize).BeginInit()
    CType(Me.AxArcReaderControl1, System.ComponentModel.ISupportInitialize).BeginInit()
    Me.SuspendLayout()
    '
    'grpBox
    '
    Me.grpBox.Controls.Add(Me.lblValue)
    Me.grpBox.Controls.Add(Me.lblOperator)
    Me.grpBox.Controls.Add(Me.lblField)
    Me.grpBox.Controls.Add(Me.lblFieldType)
    Me.grpBox.Controls.Add(Me.lblLayerToQuery)
    Me.grpBox.Controls.Add(Me.cmdQuery)
    Me.grpBox.Controls.Add(Me.txtValue)
    Me.grpBox.Controls.Add(Me.cboLayers)
    Me.grpBox.Controls.Add(Me.optString)
    Me.grpBox.Controls.Add(Me.optNumber)
    Me.grpBox.Controls.Add(Me.cboOperator)
    Me.grpBox.Controls.Add(Me.cboFields)
    Me.grpBox.Location = New System.Drawing.Point(568, 48)
    Me.grpBox.Name = "grpBox"
    Me.grpBox.Size = New System.Drawing.Size(144, 312)
    Me.grpBox.TabIndex = 34
    Me.grpBox.TabStop = False
    Me.grpBox.Text = "Query Criteria"
    '
    'lblValue
    '
    Me.lblValue.Location = New System.Drawing.Point(8, 224)
    Me.lblValue.Name = "lblValue"
    Me.lblValue.Size = New System.Drawing.Size(120, 16)
    Me.lblValue.TabIndex = 31
    Me.lblValue.Text = "Value:"
    '
    'lblOperator
    '
    Me.lblOperator.Location = New System.Drawing.Point(8, 176)
    Me.lblOperator.Name = "lblOperator"
    Me.lblOperator.Size = New System.Drawing.Size(88, 16)
    Me.lblOperator.TabIndex = 30
    Me.lblOperator.Text = "Operator:"
    '
    'lblField
    '
    Me.lblField.Location = New System.Drawing.Point(8, 128)
    Me.lblField.Name = "lblField"
    Me.lblField.Size = New System.Drawing.Size(96, 16)
    Me.lblField.TabIndex = 29
    Me.lblField.Text = "Field to Query:"
    '
    'lblFieldType
    '
    Me.lblFieldType.Location = New System.Drawing.Point(8, 80)
    Me.lblFieldType.Name = "lblFieldType"
    Me.lblFieldType.Size = New System.Drawing.Size(104, 16)
    Me.lblFieldType.TabIndex = 28
    Me.lblFieldType.Text = "Field Type:"
    '
    'lblLayerToQuery
    '
    Me.lblLayerToQuery.Location = New System.Drawing.Point(8, 24)
    Me.lblLayerToQuery.Name = "lblLayerToQuery"
    Me.lblLayerToQuery.Size = New System.Drawing.Size(120, 16)
    Me.lblLayerToQuery.TabIndex = 27
    Me.lblLayerToQuery.Text = "Layer to Query:"
    '
    'cmdQuery
    '
    Me.cmdQuery.Location = New System.Drawing.Point(24, 272)
    Me.cmdQuery.Name = "cmdQuery"
    Me.cmdQuery.Size = New System.Drawing.Size(104, 32)
    Me.cmdQuery.TabIndex = 26
    Me.cmdQuery.Text = "Query"
    '
    'txtValue
    '
    Me.txtValue.Location = New System.Drawing.Point(8, 240)
    Me.txtValue.Name = "txtValue"
    Me.txtValue.Size = New System.Drawing.Size(120, 20)
    Me.txtValue.TabIndex = 25
    Me.txtValue.Text = ""
    '
    'cboLayers
    '
    Me.cboLayers.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
    Me.cboLayers.Location = New System.Drawing.Point(8, 40)
    Me.cboLayers.Name = "cboLayers"
    Me.cboLayers.Size = New System.Drawing.Size(120, 21)
    Me.cboLayers.TabIndex = 24
    '
    'optString
    '
    Me.optString.Location = New System.Drawing.Point(80, 96)
    Me.optString.Name = "optString"
    Me.optString.Size = New System.Drawing.Size(56, 16)
    Me.optString.TabIndex = 23
    Me.optString.Text = "String"
    '
    'optNumber
    '
    Me.optNumber.Location = New System.Drawing.Point(8, 96)
    Me.optNumber.Name = "optNumber"
    Me.optNumber.Size = New System.Drawing.Size(64, 16)
    Me.optNumber.TabIndex = 22
    Me.optNumber.Text = "Number"
    '
    'cboOperator
    '
    Me.cboOperator.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
    Me.cboOperator.Location = New System.Drawing.Point(8, 192)
    Me.cboOperator.Name = "cboOperator"
    Me.cboOperator.Size = New System.Drawing.Size(120, 21)
    Me.cboOperator.TabIndex = 21
    '
    'cboFields
    '
    Me.cboFields.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
    Me.cboFields.Location = New System.Drawing.Point(8, 144)
    Me.cboFields.Name = "cboFields"
    Me.cboFields.Size = New System.Drawing.Size(120, 21)
    Me.cboFields.TabIndex = 20
    '
    'cmdFullExtent
    '
    Me.cmdFullExtent.Location = New System.Drawing.Point(232, 16)
    Me.cmdFullExtent.Name = "cmdFullExtent"
    Me.cmdFullExtent.Size = New System.Drawing.Size(72, 24)
    Me.cmdFullExtent.TabIndex = 33
    Me.cmdFullExtent.Text = "Full Extent"
    '
    'cmdFailCenterAt
    '
    Me.cmdFailCenterAt.Location = New System.Drawing.Point(488, 496)
    Me.cmdFailCenterAt.Name = "cmdFailCenterAt"
    Me.cmdFailCenterAt.Size = New System.Drawing.Size(112, 24)
    Me.cmdFailCenterAt.TabIndex = 27
    Me.cmdFailCenterAt.Text = "Center At"
    '
    'cmdMeetCenterAt
    '
    Me.cmdMeetCenterAt.Location = New System.Drawing.Point(136, 496)
    Me.cmdMeetCenterAt.Name = "cmdMeetCenterAt"
    Me.cmdMeetCenterAt.Size = New System.Drawing.Size(112, 24)
    Me.cmdMeetCenterAt.TabIndex = 24
    Me.cmdMeetCenterAt.Text = "Center At"
    '
    'cmdMeetZoomTo
    '
    Me.cmdMeetZoomTo.Location = New System.Drawing.Point(16, 496)
    Me.cmdMeetZoomTo.Name = "cmdMeetZoomTo"
    Me.cmdMeetZoomTo.Size = New System.Drawing.Size(112, 24)
    Me.cmdMeetZoomTo.TabIndex = 23
    Me.cmdMeetZoomTo.Text = "Zoom To"
    '
    'lblFails
    '
    Me.lblFails.Location = New System.Drawing.Point(376, 376)
    Me.lblFails.Name = "lblFails"
    Me.lblFails.Size = New System.Drawing.Size(336, 24)
    Me.lblFails.TabIndex = 36
    '
    'optPan
    '
    Me.optPan.Appearance = System.Windows.Forms.Appearance.Button
    Me.optPan.Location = New System.Drawing.Point(304, 16)
    Me.optPan.Name = "optPan"
    Me.optPan.Size = New System.Drawing.Size(72, 24)
    Me.optPan.TabIndex = 32
    Me.optPan.Text = "Pan"
    Me.optPan.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
    '
    'optZoomOut
    '
    Me.optZoomOut.Appearance = System.Windows.Forms.Appearance.Button
    Me.optZoomOut.Location = New System.Drawing.Point(160, 16)
    Me.optZoomOut.Name = "optZoomOut"
    Me.optZoomOut.Size = New System.Drawing.Size(72, 24)
    Me.optZoomOut.TabIndex = 31
    Me.optZoomOut.Text = "Zoom Out"
    Me.optZoomOut.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
    '
    'optZoomIn
    '
    Me.optZoomIn.Appearance = System.Windows.Forms.Appearance.Button
    Me.optZoomIn.Location = New System.Drawing.Point(88, 16)
    Me.optZoomIn.Name = "optZoomIn"
    Me.optZoomIn.Size = New System.Drawing.Size(72, 24)
    Me.optZoomIn.TabIndex = 30
    Me.optZoomIn.Text = "Zoom In"
    Me.optZoomIn.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
    '
    'cmdFailZoomTo
    '
    Me.cmdFailZoomTo.Location = New System.Drawing.Point(368, 496)
    Me.cmdFailZoomTo.Name = "cmdFailZoomTo"
    Me.cmdFailZoomTo.Size = New System.Drawing.Size(112, 24)
    Me.cmdFailZoomTo.TabIndex = 26
    Me.cmdFailZoomTo.Text = "Zoom To"
    '
    'cmdMeetFlash
    '
    Me.cmdMeetFlash.Location = New System.Drawing.Point(256, 496)
    Me.cmdMeetFlash.Name = "cmdMeetFlash"
    Me.cmdMeetFlash.Size = New System.Drawing.Size(104, 24)
    Me.cmdMeetFlash.TabIndex = 25
    Me.cmdMeetFlash.Text = "Flash"
    '
    'lblMeets
    '
    Me.lblMeets.Location = New System.Drawing.Point(16, 376)
    Me.lblMeets.Name = "lblMeets"
    Me.lblMeets.Size = New System.Drawing.Size(344, 24)
    Me.lblMeets.TabIndex = 35
    '
    'cmdOpen
    '
    Me.cmdOpen.Location = New System.Drawing.Point(16, 16)
    Me.cmdOpen.Name = "cmdOpen"
    Me.cmdOpen.Size = New System.Drawing.Size(72, 24)
    Me.cmdOpen.TabIndex = 29
    Me.cmdOpen.Text = "Open"
    '
    'cmdFailFlash
    '
    Me.cmdFailFlash.Location = New System.Drawing.Point(608, 496)
    Me.cmdFailFlash.Name = "cmdFailFlash"
    Me.cmdFailFlash.Size = New System.Drawing.Size(104, 24)
    Me.cmdFailFlash.TabIndex = 28
    Me.cmdFailFlash.Text = "Flash"
    '
    'AxMSFlexGrid1
    '
    Me.AxMSFlexGrid1.Location = New System.Drawing.Point(16, 400)
    Me.AxMSFlexGrid1.Name = "AxMSFlexGrid1"
    Me.AxMSFlexGrid1.OcxState = CType(resources.GetObject("AxMSFlexGrid1.OcxState"), System.Windows.Forms.AxHost.State)
    Me.AxMSFlexGrid1.Size = New System.Drawing.Size(344, 88)
    Me.AxMSFlexGrid1.TabIndex = 37
    '
    'AxMSFlexGrid2
    '
    Me.AxMSFlexGrid2.Location = New System.Drawing.Point(368, 400)
    Me.AxMSFlexGrid2.Name = "AxMSFlexGrid2"
    Me.AxMSFlexGrid2.OcxState = CType(resources.GetObject("AxMSFlexGrid2.OcxState"), System.Windows.Forms.AxHost.State)
    Me.AxMSFlexGrid2.Size = New System.Drawing.Size(344, 88)
    Me.AxMSFlexGrid2.TabIndex = 38
    '
    'AxArcReaderControl1
    '
    Me.AxArcReaderControl1.Location = New System.Drawing.Point(16, 48)
    Me.AxArcReaderControl1.Name = "AxArcReaderControl1"
    Me.AxArcReaderControl1.OcxState = CType(resources.GetObject("AxArcReaderControl1.OcxState"), System.Windows.Forms.AxHost.State)
    Me.AxArcReaderControl1.Size = New System.Drawing.Size(544, 312)
    Me.AxArcReaderControl1.TabIndex = 39
    '
    'AttributeQuery
    '
    Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
    Me.ClientSize = New System.Drawing.Size(720, 525)
    Me.Controls.Add(Me.AxArcReaderControl1)
    Me.Controls.Add(Me.AxMSFlexGrid2)
    Me.Controls.Add(Me.AxMSFlexGrid1)
    Me.Controls.Add(Me.grpBox)
    Me.Controls.Add(Me.cmdFullExtent)
    Me.Controls.Add(Me.cmdFailCenterAt)
    Me.Controls.Add(Me.cmdMeetCenterAt)
    Me.Controls.Add(Me.cmdMeetZoomTo)
    Me.Controls.Add(Me.lblFails)
    Me.Controls.Add(Me.optPan)
    Me.Controls.Add(Me.optZoomOut)
    Me.Controls.Add(Me.optZoomIn)
    Me.Controls.Add(Me.cmdFailZoomTo)
    Me.Controls.Add(Me.cmdMeetFlash)
    Me.Controls.Add(Me.lblMeets)
    Me.Controls.Add(Me.cmdOpen)
    Me.Controls.Add(Me.cmdFailFlash)
    Me.Name = "AttributeQuery"
    Me.Text = "AttributeQuery (LesserThan / GreaterThan) "
    Me.grpBox.ResumeLayout(False)
    CType(Me.AxMSFlexGrid1, System.ComponentModel.ISupportInitialize).EndInit()
    CType(Me.AxMSFlexGrid2, System.ComponentModel.ISupportInitialize).EndInit()
    CType(Me.AxArcReaderControl1, System.ComponentModel.ISupportInitialize).EndInit()
    Me.ResumeLayout(False)

  End Sub

#End Region

  Private m_pARFeatureSetMeets As ARFeatureSet
  Private m_pARFeatureSetFails As ARFeatureSet
  Private m_InverseOperators(1, 5)
  Private m_LayersIndex As Collections.Hashtable

  Private Sub AttributeQuery_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    'Disable search  & map tools
    EnableSearchTools(False)
    EnableMapTools(False)
    EnableMeetHighlightTools(False)
    EnableFailHighlightTools(False)

    'Populate Inverse Operators array
    PopulateInverseOperators()

    optNumber.Checked = True

  End Sub

  Private Sub MixedControls_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles optZoomIn.Click, optZoomOut.Click, optPan.Click

    Select Case sender.Name
      Case "optZoomIn"
        AxArcReaderControl1.CurrentARTool = esriARTool.esriARToolMapZoomIn
      Case "optZoomOut"
        AxArcReaderControl1.CurrentARTool = esriARTool.esriARToolMapZoomOut
      Case "optPan"
        AxArcReaderControl1.CurrentARTool = esriARTool.esriARToolMapPan
    End Select

  End Sub
  Private Sub MixedDisplayResults_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdMeetZoomTo.Click, cmdMeetCenterAt.Click, cmdMeetFlash.Click, cmdFailZoomTo.Click, cmdFailCenterAt.Click, cmdFailFlash.Click

    Select Case sender.Name
      Case "cmdMeetZoomTo"
        m_pARFeatureSetMeets.ZoomTo()
      Case "cmdMeetCenterAt"
        m_pARFeatureSetMeets.CenterAt()
      Case "cmdMeetFlash"
        m_pARFeatureSetMeets.Flash()
      Case "cmdFailZoomTo"
        m_pARFeatureSetFails.ZoomTo()
      Case "cmdFailCenterAt"
        m_pARFeatureSetFails.CenterAt()
      Case "cmdFailFlash"
        m_pARFeatureSetFails.Flash()
    End Select

  End Sub
  Private Sub DataType_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles optNumber.Click, optString.Click

    Select Case sender.Name
      Case "optNumber"
        PopulateFields(False)
        PopulateOperators(False)
      Case "optString"
        PopulateFields(True)
        PopulateOperators(True)
    End Select

  End Sub
  Private Sub cmdOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdOpen.Click

    'Open a file dialog for selecting map documents
    OpenFileDialog1.Title = "Select Published Map Document"
    OpenFileDialog1.Filter = "Published Map Documents (*.pmf)|*.pmf"
    OpenFileDialog1.ShowDialog()

    'Exit if no map document is selected
    Dim sFilePath As String
    sFilePath = OpenFileDialog1.FileName
    If sFilePath = "" Then Exit Sub

    'Load the specified pmf
    If AxArcReaderControl1.CheckDocument(sFilePath) = True Then
      AxArcReaderControl1.LoadDocument(sFilePath)
    Else
      MsgBox("This document cannot be loaded!")
      Exit Sub
    End If

    'Determine whether permission to search layers and query field values
    Dim bQueryFeatures As Boolean
    Dim bQueryValues As Boolean
    bQueryFeatures = AxArcReaderControl1.HasDocumentPermission(esriARDocumentPermissions.esriARDocumentPermissionsQueryFeatures)
    bQueryValues = AxArcReaderControl1.HasDocumentPermission(esriARDocumentPermissions.esriARDocumentPermissionsQueryValues)

    If (bQueryFeatures = False) Or (bQueryValues = False) Then
      MsgBox("The selected Document does not have Query Permissions.", vbInformation)
      AxArcReaderControl1.UnloadDocument()
      Exit Sub
    End If

    'Disable search  & map tools
    cboLayers.Items.Clear()
    cboFields.Items.Clear()
    EnableSearchTools(False)
    EnableMeetHighlightTools(False)
    EnableFailHighlightTools(False)

    'Add map layers to combo and store in HashTable with combo index
    m_LayersIndex = New Hashtable
    ARPopulateComboWithMapLayers(cboLayers, m_LayersIndex)

    'Select first searchable layer
    Dim i As Integer
    For i = 0 To cboLayers.Items.Count - 1 Step i + 1
      Dim pARLayer As ARLayer = CType(m_LayersIndex(i), ARLayer)
      If (pARLayer.Searchable = True) Then
        cboLayers.SelectedIndex = i
        Exit For
      End If
    Next

    'Enable search & map tools
    EnableSearchTools(True)
    EnableMapTools(True)

  End Sub
  Private Sub ARPopulateComboWithMapLayers(ByVal Layers As ComboBox, ByVal LayersIndex As System.Collections.Hashtable)

    'In case cboLayers is already populated
    LayersIndex.Clear()
    Layers.Items.Clear()

    Dim pARLayer As ARLayer
    Dim pARGroupLayer As ARLayer

    ' Get the focus map
    Dim pARMap As ARMap = AxArcReaderControl1.ARPageLayout.FocusARMap

    ' Loop through each layer in the focus map
    Dim i As Integer
    For i = 0 To pARMap.ARLayerCount - 1 Step i + 1
      ' Get the layer name
      pARLayer = pARMap.ARLayer(i)
      ''Code was here
      If pARLayer.IsGroupLayer = True Then
        'If a GroupLayer add the ARChildLayers to the combo and HashTable
        Dim g As Integer
        For g = 0 To pARLayer.ARLayerCount - 1 Step g + 1
          pARGroupLayer = pARMap.ARLayer(i).ChildARLayer(g)
          Layers.Items.Add(pARGroupLayer.Name)
          LayersIndex.Add(Layers.Items.Count - 1, pARGroupLayer)
        Next
      ElseIf pARLayer.Searchable = True Then
        Layers.Items.Add(pARLayer.Name)
        LayersIndex.Add(Layers.Items.Count - 1, pARLayer)
      End If
    Next

  End Sub
  Private Sub PopulateFields(ByVal bIsStringField As Boolean)

    Try
      'Clear all items in fields combo
      cboFields.Items.Clear()

      Dim pARLayer As ARLayer
      pARLayer = CType(m_LayersIndex(cboLayers.SelectedIndex), ARLayer)

      Dim pARSearchDef As ArcReaderSearchDef
      pARSearchDef = New ArcReaderSearchDef

      Dim pFeatureCursor As ARFeatureCursor
      pFeatureCursor = pARLayer.SearchARFeatures(pARSearchDef)

      'Get the first feature in order to access the field names
      Dim pARFeature As ARFeature
      pARFeature = pFeatureCursor.NextARFeature

      'Loop through fields and add field names to combo
      Dim i As Integer
      i = 0

      Do Until i = pARFeature.FieldCount
        If bIsStringField = True Then
          If pARFeature.FieldType(i) = esriARFieldType.esriARFieldTypeString Then
            cboFields.Items.Add(pARFeature.FieldName(i))
          End If
        Else
          If (pARFeature.FieldType(i) = esriARFieldType.esriARFieldTypeDouble) Or _
          (pARFeature.FieldType(i) = esriARFieldType.esriARFieldTypeInteger) Or _
          (pARFeature.FieldType(i) = esriARFieldType.esriARFieldTypeSingle) Or _
          (pARFeature.FieldType(i) = esriARFieldType.esriARFieldTypeSmallInteger) Or _
          (pARFeature.FieldType(i) = esriARFieldType.esriARFieldTypeOID) Then
            cboFields.Items.Add(pARFeature.FieldName(i))
          End If
        End If
        i = i + 1
      Loop

      If cboFields.Items.Count <> 0 Then
        cboFields.SelectedIndex = 0
      End If
    Catch
      MsgBox("An error occurred populating the Field ComboBox.")
    End Try

  End Sub
  Private Sub PopulateOperators(ByVal bIsStringField As Boolean)

    'Clear any current values from combo
    cboOperator.Items.Clear()

    If bIsStringField = True Then
      cboOperator.Items.Insert(0, "=")
      cboOperator.Items.Insert(1, "<>")
    Else
      cboOperator.Items.Insert(0, "=")
      cboOperator.Items.Insert(1, "<>")
      cboOperator.Items.Insert(2, ">")
      cboOperator.Items.Insert(3, ">=")
      cboOperator.Items.Insert(4, "<=")
      cboOperator.Items.Insert(5, "<")
    End If

    cboOperator.SelectedIndex = 0

  End Sub
  Private Sub PopulateInverseOperators()

    'Populate the collection
    'It is used to inverse the operator used in the WhereClause
    'Array def is (Operator in List Box, Inverse Operator)
    m_InverseOperators(0, 0) = "="
    m_InverseOperators(1, 0) = "<>"

    m_InverseOperators(0, 1) = "<>"
    m_InverseOperators(1, 1) = "="

    m_InverseOperators(0, 2) = ">"
    m_InverseOperators(1, 2) = "<="

    m_InverseOperators(0, 3) = ">="
    m_InverseOperators(1, 3) = "<"

    m_InverseOperators(0, 4) = "<="
    m_InverseOperators(1, 4) = ">"

    m_InverseOperators(0, 5) = "<"
    m_InverseOperators(1, 5) = ">="

  End Sub
  Private Sub EnableSearchTools(ByVal EnabledState As Boolean)

    txtValue.Text = ""
    optNumber.Enabled = EnabledState
    optString.Enabled = EnabledState
    cboFields.Enabled = EnabledState
    cboOperator.Enabled = EnabledState
    txtValue.Enabled = EnabledState
    cmdQuery.Enabled = EnabledState

  End Sub
  Private Sub EnableMapTools(ByVal EnabledState As Boolean)

    optZoomIn.Enabled = EnabledState
    optZoomOut.Enabled = EnabledState
    optPan.Enabled = EnabledState
    cmdFullExtent.Enabled = EnabledState

  End Sub
  Private Sub EnableMeetHighlightTools(ByVal EnabledState As Boolean)

    cmdMeetFlash.Enabled = EnabledState
    cmdMeetZoomTo.Enabled = EnabledState
    cmdMeetCenterAt.Enabled = EnabledState

  End Sub
  Private Sub EnableFailHighlightTools(ByVal EnabledState As Boolean)

    cmdFailFlash.Enabled = EnabledState
    cmdFailZoomTo.Enabled = EnabledState
    cmdFailCenterAt.Enabled = EnabledState

  End Sub

  Private Sub cboLayers_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboLayers.SelectedIndexChanged

    Dim pARLayer As ARLayer = CType(m_LayersIndex(cboLayers.SelectedIndex), ARLayer)
    'Check if layer can be searched
    If (pARLayer.Searchable) Then
      EnableSearchTools(True)
      PopulateFields(optString.Checked)
      PopulateOperators(optString.Checked)
    Else
      MessageBox.Show("The Layer you have selected is not Searchable.")
      EnableSearchTools(False)
    End If

    'Clear Grids, Labels and disable display tools
    AxMSFlexGrid1.Clear()
    AxMSFlexGrid2.Clear()
    lblMeets.Text = ""
    lblFails.Text = ""
    EnableMeetHighlightTools(False)
    EnableFailHighlightTools(False)

  End Sub
  Private Sub cmdQuery_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdQuery.Click

    'Set mouse cursor as this can take some time with large datasets
    Me.Cursor.Current = Cursors.WaitCursor

    'Check value has been entered in field combo
    If Trim(cboFields.Text) = "" Then
      MsgBox("No field has been selected.", vbInformation)
      Me.Cursor = Cursors.Default
      Exit Sub
    End If

    'Check value has been entered in operator combo
    If Trim(cboOperator.Text) = "" Then
      MsgBox("No operator has been selected.", vbInformation)
      Me.Cursor = Cursors.Default
      Exit Sub
    End If

    'Check value has been entered in value textbox
    If Trim(txtValue.Text) = "" Then
      MsgBox("You have not entered a threshold value.", vbInformation)
      txtValue.Focus()
      Me.Cursor = Cursors.Default
      Exit Sub
    End If

    'Get layer to query
    Dim pARMap As ARMap
    pARMap = AxArcReaderControl1.ARPageLayout.FocusARMap

    Dim pARLayer As ARLayer = CType(m_LayersIndex(cboLayers.SelectedIndex), ARLayer)

    'Build the ARSearchDef
    Dim pARSearchDef As ArcReaderSearchDef
    pARSearchDef = New ArcReaderSearchDef

    'Build WhereClause that meets search criteria
    Dim sWhereClause As String
    'Remove quotes from WhereClause if search is numeric
    If optNumber.Checked = True Then
      sWhereClause = cboFields.Text + " " + cboOperator.Text + " " + txtValue.Text
    Else
      sWhereClause = cboFields.Text + " " + cboOperator.Text + " '" + txtValue.Text + "'"
    End If
    pARSearchDef.WhereClause = sWhereClause

    'Get ARFeatureSet that meets the search criteria
    m_pARFeatureSetMeets = pARLayer.QueryARFeatures(pARSearchDef)

    'Build WhereClause that fails search criteria
    'Remove quotes from WhereClause if search is numeric
    If optNumber.Checked = True Then
      sWhereClause = cboFields.Text + " " + m_InverseOperators(1, cboOperator.SelectedIndex) + " " + txtValue.Text
    Else
      sWhereClause = cboFields.Text + " " + m_InverseOperators(1, cboOperator.SelectedIndex) + " '" + txtValue.Text + "'"
    End If
    pARSearchDef.WhereClause = sWhereClause

    'Get ARFeatureSet that fails search criteria
    m_pARFeatureSetFails = pARLayer.QueryARFeatures(pARSearchDef)

    'Reset mouse cursor
    Me.Cursor = Cursors.Default

    'Populate the FlexGrid Controls with the ARFeatureSet's
    PopulateFlexGrids(AxMSFlexGrid1, m_pARFeatureSetMeets)
    PopulateFlexGrids(AxMSFlexGrid2, m_pARFeatureSetFails)

    If m_pARFeatureSetMeets.ARFeatureCount > 0 Then
      EnableMeetHighlightTools(True)
      lblMeets.Text = "Features MEETING the search criteria: " + m_pARFeatureSetMeets.ARFeatureCount.ToString()
    Else
      EnableMeetHighlightTools(False)
      AxMSFlexGrid1.Clear()
      lblMeets.Text = "Features MEETING the search criteria: 0"
    End If
    If m_pARFeatureSetFails.ARFeatureCount > 0 Then
      EnableFailHighlightTools(True)
      lblFails.Text = "Features FAILING the search criteria: " + m_pARFeatureSetFails.ARFeatureCount.ToString()
    Else
      EnableFailHighlightTools(False)
      AxMSFlexGrid2.Clear()
      lblMeets.Text = "Features FAILING the search criteria: 0"
    End If

  End Sub
  Private Sub PopulateFlexGrids(ByVal pFlexGrid As AxMSFlexGridLib.AxMSFlexGrid, ByVal pARFeatureSet As ARFeatureSet)

    'Get first feature in ARFeatureSet
    Dim pARFeature As ARFeature
    pARFeatureSet.Reset()
    pARFeature = pARFeatureSet.Next

    'Clear grids
    pFlexGrid.Clear()

    'Exit if no features in set
    If pARFeature Is Nothing Then Exit Sub

    'Reset the Grid dimensions
    pFlexGrid.Rows = pARFeatureSet.ARFeatureCount + 2
    pFlexGrid.Cols = pARFeature.FieldCount + 1

    'Change cursor while grid populates
    Me.Cursor = Cursors.WaitCursor

    Dim c As Integer, r As Integer
    c = 1
    r = 1

    'Loop through and add field names
    Do Until c = pARFeature.FieldCount + 1
      pFlexGrid.Row = 0
      pFlexGrid.Col = c
      pFlexGrid.Text = pARFeature.FieldName(c - 1)
      c = c + 1
    Loop

    'Reset Col Counter
    c = 1

    'Populate Grid
    Do Until r = pARFeatureSet.ARFeatureCount + 1
      pFlexGrid.Row = r

      Do Until c = pARFeature.FieldCount + 1
        pFlexGrid.Col = c
        pFlexGrid.Text = ARFeatureValueAsString(pARFeature, c - 1)
        c = c + 1
      Loop

      'Reset Column
      c = 1
      'Move to next Row
      r = r + 1
      'Move to next Feature in the FeatureSet
      pARFeature = pARFeatureSet.Next
    Loop

    'Reset mouse cursor
    Me.Cursor = Cursors.Default

  End Sub
  Private Function ARFeatureValueAsString(ByVal pARFeature As ARFeature, ByVal pFieldNameIndex As Long) As String

    'If there is an issue accessing the value the function returns a string of asterisks
    'There are many reason Asterisks may be returned...
    'The return value cant be cast into a string e.g. a BLOB value
    'The return value is stored within a hidden field in the PMF
    'The return value is a Geometry Object

    On Error Resume Next
    ARFeatureValueAsString = "***"
    ARFeatureValueAsString = CStr(pARFeature.Value(pARFeature.FieldName(pFieldNameIndex)))

  End Function
  Private Sub txtValue_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtValue.TextChanged

    If (optNumber.Checked = True) Then
      If (IsNumeric(txtValue.Text) = False) Then
        txtValue.Clear()
      End If
    End If

  End Sub

  Private Sub cmdFullExtent_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdFullExtent.Click
    AxArcReaderControl1.ARPageLayout.FocusARMap.ZoomToFullExtent()
  End Sub
End Class