About the Server spatial query server object extension Sample
[C#]
PropertyForm.cs
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; namespace SpatialQuerySOE.ArcCatalog { /// <summary> /// Defines the UI for the Spatial Query SOE /// </summary> public partial class PropertyForm : Form { #region Member Variables // The current SOE layer private string m_layer; // Current SOE field private string m_field; // Tracks whether the form is initializing private bool m_init = false; private System.Collections.Generic.Dictionary<string, string[]> m_fieldsDictionary = new System.Collections.Generic.Dictionary<string,string[]>(); #endregion #region Constructor public PropertyForm() { InitializeComponent(); // Get ArcCatalog's representation of the map service being modified System.Type type = System.Type.GetTypeFromCLSID(typeof(ESRI.ArcGIS.Framework.AppRefClass).GUID); ESRI.ArcGIS.CatalogUI.IGxApplication gxApp = Activator.CreateInstance(type) as ESRI.ArcGIS.CatalogUI.IGxApplication; ESRI.ArcGIS.Catalog.IGxAGSObject gxAgsObj = gxApp.SelectedObject as ESRI.ArcGIS.Catalog.IGxAGSObject; // If the service is not stopped, disable the layers and fields drop-down lists so that the SOE cannot be configured if (gxAgsObj.Status != "Stopped") { ComboLayers.Enabled = false; ComboFields.Enabled = false; } } #endregion #region Internal Properties - getHWnd, Layer, Field, PageSite /// <summary> /// The form's handle /// </summary> internal int getHWnd() { return this.Handle.ToInt32(); } /// <summary> /// The currently selected layer /// </summary> internal string Layer { get { return m_layer; } set { m_layer = value; } } /// <summary> /// The currently selected field /// </summary> internal string Field { get { return m_field; } set { m_field = value; } } /// <summary> /// The PageSite of the IComPropertyPage object using the form. Allows the form to report when its contents have changed. /// </summary> internal ESRI.ArcGIS.Framework.IComPropertyPageSite PageSite { private get; set; } #endregion #region Internal Methods - SetMap /// <summary> /// Sets the map used to populate the layers and fields drop-down lists /// </summary> /// <param name="filePath">the path to the map document</param> internal void SetMap(string filePath) { // Open the map document ESRI.ArcGIS.Carto.IMapDocument mapDocument = new ESRI.ArcGIS.Carto.MapDocumentClass(); mapDocument.Open(filePath, null); // The call to get_Map() will create a lock (ldb) on a personal gdb. Make sure ArcCatalog user and // ArcGIS Server container account has read\write access to data location. If not, // feature classes in the personal gdb may not be accessible (or visible in the map). ESRI.ArcGIS.Carto.IMap map = mapDocument.get_Map(0); // Get IGeoFeatureLayers from the map ESRI.ArcGIS.esriSystem.UID id = new ESRI.ArcGIS.esriSystem.UIDClass(); id.Value = "{E156D7E5-22AF-11D3-9F99-00C04F6BC78E}"; ESRI.ArcGIS.Carto.IEnumLayer enumLayer = map.get_Layers(id, true); int selectedIndex = 0; string[] fieldNames = null; m_fieldsDictionary.Clear(); // Add the names of simple polygon feature layers to the layers drop-down and store the names // of each layer's fields in a dictionary ESRI.ArcGIS.Carto.IFeatureLayer featureLayer = null; while ((featureLayer = enumLayer.Next() as ESRI.ArcGIS.Carto.IFeatureLayer) != null) { if (featureLayer.FeatureClass.ShapeType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon && featureLayer.FeatureClass.FeatureType == ESRI.ArcGIS.Geodatabase.esriFeatureType.esriFTSimple) ComboLayers.Items.Add(featureLayer.Name); if (featureLayer.Name == m_layer) selectedIndex = ComboLayers.Items.Count - 1; fieldNames = new string[featureLayer.FeatureClass.Fields.FieldCount]; for (int i = 0; i < fieldNames.Length; i++) fieldNames[i] = featureLayer.FeatureClass.Fields.get_Field(i).Name; m_fieldsDictionary.Add(featureLayer.Name, fieldNames); } mapDocument.Close(); mapDocument = null; map = null; // Toggle the init flag and initialize the layers drop-down to show the current SOE layer. Init is used // to prevent the drop-down's SelectedIndexChanged logic from setting m_field during initialization. m_init = true; ComboLayers.SelectedIndex = selectedIndex; } #endregion #region Control Event Handlers - ComboLayers_SelectedIndexChanged, ComboFields_SelectedIndexChanged, PropertyForm_FormClosed // Fires when a new item is selected from the layers drop-down private void ComboLayers_SelectedIndexChanged(object sender, EventArgs e) { m_layer = ComboLayers.Text; ComboFields.Items.Clear(); // Add the fields for the currently selected layer to the fields drop-down int selectedIndex = 0; string[] fieldNames = m_fieldsDictionary[m_layer]; for (int i = 0; i < fieldNames.Length; i++) { ComboFields.Items.Add(fieldNames[i]); // Get the index of the current field if the method is executing during initialization and // the current field match's the SOE field if (m_init && fieldNames[i] == m_field) selectedIndex = ComboFields.Items.Count - 1; } // Update the field and layer properties if executing during initialization. Otherwise, toggle the // init boolean to indicate initialization is complete. if (m_init) m_init = false; // Set the fields drop-down to show the current SOE field. ComboFields.SelectedIndex = selectedIndex; } // Fires when a new item is selected from the fields drop-down private void ComboFields_SelectedIndexChanged(object sender, EventArgs e) { // Update the current SOE field m_field = ComboFields.Text; // Notify ArcCatalog that the properties have changed this.PageSite.PageChanged(); } #endregion } }
[Visual Basic .NET]
PropertyForm.vb
Imports Microsoft.VisualBasic Imports System Imports System.Drawing Imports System.Collections Imports System.ComponentModel Imports System.Windows.Forms Namespace SpatialQuerySOE.ArcCatalog_VBNet ''' <summary> ''' Defines the UI for the Spatial Query SOE ''' </summary> Partial Public Class PropertyForm Inherits Form #Region "Member Variables" ' The current SOE layer Private m_layer As String ' Current SOE field Private m_field As String ' Tracks whether the form is initializing Private m_init As Boolean = False Private m_fieldsDictionary As New System.Collections.Generic.Dictionary(Of String, String())() #End Region #Region "Constructor" Public Sub New() InitializeComponent() ' Get ArcCatalog's representation of the map service being modified Dim type As System.Type = System.Type.GetTypeFromCLSID(GetType(ESRI.ArcGIS.Framework.AppRefClass).GUID) Dim gxApp As ESRI.ArcGIS.CatalogUI.IGxApplication = TryCast(Activator.CreateInstance(type), ESRI.ArcGIS.CatalogUI.IGxApplication) Dim gxAgsObj As ESRI.ArcGIS.Catalog.IGxAGSObject = TryCast(gxApp.SelectedObject, ESRI.ArcGIS.Catalog.IGxAGSObject) ' If the service is not stopped, disable the layers and fields drop-down lists so that the SOE cannot be configured If gxAgsObj.Status <> "Stopped" Then ComboLayers.Enabled = False ComboFields.Enabled = False End If End Sub #End Region #Region "Internal Properties - getHWnd, Layer, Field, PageSite" ''' <summary> ''' The form's handle ''' </summary> Friend Function getHWnd() As Integer Return Me.Handle.ToInt32() End Function ''' <summary> ''' The currently selected layer ''' </summary> Friend Property Layer() As String Get Return m_layer End Get Set(ByVal value As String) m_layer = value End Set End Property ''' <summary> ''' The currently selected field ''' </summary> Friend Property Field() As String Get Return m_field End Get Set(ByVal value As String) m_field = value End Set End Property ''' <summary> ''' The PageSite of the IComPropertyPage object using the form. Allows the form to report when its contents have changed. ''' </summary> Private privatePageSite As ESRI.ArcGIS.Framework.IComPropertyPageSite Friend Property PageSite() As ESRI.ArcGIS.Framework.IComPropertyPageSite Private Get Return privatePageSite End Get Set(ByVal value As ESRI.ArcGIS.Framework.IComPropertyPageSite) privatePageSite = value End Set End Property #End Region #Region "Internal Methods - SetMap" ''' <summary> ''' Sets the map used to populate the layers and fields drop-down lists ''' </summary> ''' <param name="filePath">the path to the map document</param> Friend Sub SetMap(ByVal filePath As String) ' Open the map document Dim mapDocument As ESRI.ArcGIS.Carto.IMapDocument = New ESRI.ArcGIS.Carto.MapDocumentClass() mapDocument.Open(filePath, Nothing) ' The call to get_Map() will create a lock (ldb) on a personal gdb. Make sure ArcCatalog user and ' ArcGIS Server container account has read\write access to data location. If not, ' feature classes in the personal gdb may not be accessible (or visible in the map). Dim map As ESRI.ArcGIS.Carto.IMap = mapDocument.Map(0) ' Get IGeoFeatureLayers from the map Dim id As ESRI.ArcGIS.esriSystem.UID = New ESRI.ArcGIS.esriSystem.UIDClass() id.Value = "{E156D7E5-22AF-11D3-9F99-00C04F6BC78E}" Dim enumLayer As ESRI.ArcGIS.Carto.IEnumLayer = map.Layers(id, True) Dim selectedIndex As Integer = 0 Dim fieldNames() As String = Nothing m_fieldsDictionary.Clear() ' Add the names of simple polygon feature layers to the layers drop-down and store the names ' of each layer's fields in a dictionary Dim featureLayer As ESRI.ArcGIS.Carto.IFeatureLayer = Nothing featureLayer = TryCast(enumLayer.Next(), ESRI.ArcGIS.Carto.IFeatureLayer) Do While featureLayer IsNot Nothing If featureLayer.FeatureClass.ShapeType = ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon AndAlso featureLayer.FeatureClass.FeatureType = ESRI.ArcGIS.Geodatabase.esriFeatureType.esriFTSimple Then ComboLayers.Items.Add(featureLayer.Name) End If If featureLayer.Name = m_layer Then selectedIndex = ComboLayers.Items.Count - 1 End If fieldNames = New String(featureLayer.FeatureClass.Fields.FieldCount - 1) {} For i As Integer = 0 To fieldNames.Length - 1 fieldNames(i) = featureLayer.FeatureClass.Fields.Field(i).Name Next i m_fieldsDictionary.Add(featureLayer.Name, fieldNames) featureLayer = TryCast(enumLayer.Next(), ESRI.ArcGIS.Carto.IFeatureLayer) Loop mapDocument.Close() mapDocument = Nothing map = Nothing ' Toggle the init flag and initialize the layers drop-down to show the current SOE layer. Init is used ' to prevent the drop-down's SelectedIndexChanged logic from setting m_field during initialization. m_init = True ComboLayers.SelectedIndex = selectedIndex End Sub #End Region #Region "Control Event Handlers - ComboLayers_SelectedIndexChanged, ComboFields_SelectedIndexChanged, PropertyForm_FormClosed" ' Fires when a new item is selected from the layers drop-down Private Sub ComboLayers_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles ComboLayers.SelectedIndexChanged m_layer = ComboLayers.Text ComboFields.Items.Clear() ' Add the fields for the currently selected layer to the fields drop-down Dim selectedIndex As Integer = 0 Dim fieldNames() As String = m_fieldsDictionary(m_layer) For i As Integer = 0 To fieldNames.Length - 1 ComboFields.Items.Add(fieldNames(i)) ' Get the index of the current field if the method is executing during initialization and ' the current field match's the SOE field If m_init AndAlso fieldNames(i) = m_field Then selectedIndex = ComboFields.Items.Count - 1 End If Next i ' Update the field and layer properties if executing during initialization. Otherwise, toggle the ' init boolean to indicate initialization is complete. If m_init Then m_init = False End If ' Set the fields drop-down to show the current SOE field. ComboFields.SelectedIndex = selectedIndex End Sub ' Fires when a new item is selected from the fields drop-down Private Sub ComboFields_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles ComboFields.SelectedIndexChanged ' Update the current SOE field m_field = ComboFields.Text ' Notify ArcCatalog that the properties have changed Me.PageSite.PageChanged() End Sub #End Region End Class End Namespace