About the ArcGIS Network Analyst extension Engine application Sample
[C#]
frmLoadLocations.cs
using System; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.NetworkAnalyst; using System.Windows.Forms; using System.Collections.Generic; // This form allows users to load locations from another point feature layer into the selected NALayer and active category. namespace NAEngine { public class frmLoadLocations : System.Windows.Forms.Form { private System.Windows.Forms.Label lblInputData; private System.Windows.Forms.CheckBox chkUseSelection; private System.Windows.Forms.Button btnCancel; private System.Windows.Forms.Button btnOK; /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.Container components = null; private System.Windows.Forms.ComboBox cboInputData; bool m_okClicked; System.Collections.IList m_listDisplayTable; public frmLoadLocations() { // // Required for Windows Form Designer support // InitializeComponent(); } /// <summary> /// Clean up any resources being used. /// </summary> 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() { this.cboInputData = new System.Windows.Forms.ComboBox(); this.lblInputData = new System.Windows.Forms.Label(); this.chkUseSelection = new System.Windows.Forms.CheckBox(); this.btnCancel = new System.Windows.Forms.Button(); this.btnOK = new System.Windows.Forms.Button(); this.SuspendLayout(); // // cboInputData // this.cboInputData.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cboInputData.Location = new System.Drawing.Point(82, 9); this.cboInputData.Name = "cboInputData"; this.cboInputData.Size = new System.Drawing.Size(381, 21); this.cboInputData.TabIndex = 0; this.cboInputData.SelectedIndexChanged += new System.EventHandler(this.cboInputData_SelectedIndexChanged); // // lblInputData // this.lblInputData.Location = new System.Drawing.Point(12, 12); this.lblInputData.Name = "lblInputData"; this.lblInputData.Size = new System.Drawing.Size(64, 24); this.lblInputData.TabIndex = 1; this.lblInputData.Text = "Input Data"; // // chkUseSelection // this.chkUseSelection.Location = new System.Drawing.Point(15, 39); this.chkUseSelection.Name = "chkUseSelection"; this.chkUseSelection.Size = new System.Drawing.Size(419, 16); this.chkUseSelection.TabIndex = 2; this.chkUseSelection.Text = "Use Selection"; // // btnCancel // this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnCancel.Location = new System.Drawing.Point(351, 61); this.btnCancel.Name = "btnCancel"; this.btnCancel.Size = new System.Drawing.Size(112, 32); this.btnCancel.TabIndex = 6; this.btnCancel.Text = "&Cancel"; this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); // // btnOK // this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnOK.Location = new System.Drawing.Point(223, 61); this.btnOK.Name = "btnOK"; this.btnOK.Size = new System.Drawing.Size(112, 32); this.btnOK.TabIndex = 5; this.btnOK.Text = "&OK"; this.btnOK.Click += new System.EventHandler(this.btnOK_Click); // // frmLoadLocations // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(479, 100); this.Controls.Add(this.btnCancel); this.Controls.Add(this.btnOK); this.Controls.Add(this.chkUseSelection); this.Controls.Add(this.lblInputData); this.Controls.Add(this.cboInputData); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; this.Name = "frmLoadLocations"; this.ShowInTaskbar = false; this.Text = "Load Locations"; this.ResumeLayout(false); } #endregion public bool ShowModal(IMapControl3 mapControl, IEngineNetworkAnalystEnvironment naEnv) { // Initialize variables m_okClicked = false; m_listDisplayTable = new System.Collections.ArrayList(); var activeCategory = naEnv.NAWindow.ActiveCategory as IEngineNAWindowCategory2; if (activeCategory == null) return false; IDataLayer dataLayer = activeCategory.DataLayer; if (dataLayer == null) return false; // Set up the title of this dialog String dataLayerName = GetDataLayerName(dataLayer); if (dataLayerName.Length == 0) return false; this.Text = "Load Items into " + dataLayerName; // Make sure the combo box lists only the appropriate possible input data layers PopulateInputDataComboBox(mapControl, dataLayer); //Select the first display table from the list if (cboInputData.Items.Count > 0) cboInputData.SelectedIndex = 0; // Show the window this.ShowDialog(); // If we selected a layer and clicked OK, load the locations if (m_okClicked && (cboInputData.SelectedIndex >= 0)) { try { // Get a cursor on the source display table (either though the selection set or table) // Use IDisplayTable because it accounts for joins, querydefs, etc. // IDisplayTable is implemented by FeatureLayers and StandaloneTables. // IDisplayTable displayTable = m_listDisplayTable[cboInputData.SelectedIndex] as IDisplayTable; ICursor cursor; if (chkUseSelection.Checked) { ISelectionSet selSet; selSet = displayTable.DisplaySelectionSet; selSet.Search(null, false, out cursor); } else cursor = displayTable.SearchDisplayTable(null, false); // Get the NAContext from the active analysis layer INAContext naContext = naEnv.NAWindow.ActiveAnalysis.Context; // Get the dataset for the active NAClass IDataset naDataset = activeCategory.NAClass as IDataset; // Setup NAClassLoader and Load Locations INAClassLoader2 naClassLoader = new NAClassLoader() as INAClassLoader2; naClassLoader.Initialize(naContext, naDataset.Name, cursor); // Avoid loading network locations onto non-traversable portions of elements INALocator3 locator = naContext.Locator as INALocator3; locator.ExcludeRestrictedElements = true; locator.CacheRestrictedElements(naContext); int rowsIn = 0; int rowsLocated = 0; naClassLoader.Load(cursor, null, ref rowsIn, ref rowsLocated); // Let the user know if some of the rows failed to locate if (rowsIn != rowsLocated) MessageBox.Show("Out of " + rowsIn + " + rows, " + rowsLocated + " rows were located", "Loading locations", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception e) { MessageBox.Show(e.Message, "Loading locations failure", MessageBoxButtons.OK, MessageBoxIcon.Error ); } return true; } return false; } private String GetDataLayerName(IDataLayer dataLayer) { var pFeatureLayer = dataLayer as IFeatureLayer; var pStandaloneTable = dataLayer as IStandaloneTable; var pLayer = dataLayer as ILayer; if (pFeatureLayer != null && pLayer.Valid) return pLayer.Name; else if (pStandaloneTable != null) return pStandaloneTable.Name; return ""; } private esriGeometryType GetDataLayerGeometryType(IDataLayer dataLayer) { var pFeatureLayer = dataLayer as IFeatureLayer; var pLayer = dataLayer as ILayer; if (pFeatureLayer != null && pLayer.Valid) { IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass; if (pFeatureClass != null) return pFeatureClass.ShapeType; } return esriGeometryType.esriGeometryNull; } private void PopulateInputDataComboBox(IMapControl3 mapControl, IDataLayer dataLayer) { esriGeometryType targetGeoType = GetDataLayerGeometryType(dataLayer); IEnumLayer sourceLayers = null; ILayer sourceLayer = null; IDisplayTable sourceDisplayTable = null; UID searchInterfaceUID = new UID(); if (targetGeoType != esriGeometryType.esriGeometryNull) { // Only include layers that are of type IFeatureLayer searchInterfaceUID.Value = typeof(IFeatureLayer).GUID.ToString("B"); sourceLayers = mapControl.Map.get_Layers(searchInterfaceUID, true); // iterate over all of the feature layers sourceLayer = sourceLayers.Next(); while (sourceLayer != null) { // Verify that the layer is a feature layer and a display table IFeatureLayer sourceFeatureLayer = sourceLayer as IFeatureLayer; sourceDisplayTable = sourceLayer as IDisplayTable; if ((sourceFeatureLayer != null) && (sourceDisplayTable != null)) { // Make sure that the geometry of the feature layer matches the geometry // of the class into which we are loading IFeatureClass sourceFeatureClass = sourceFeatureLayer.FeatureClass; esriGeometryType sourceGeoType = sourceFeatureClass.ShapeType; if ((sourceGeoType == targetGeoType) || (targetGeoType == esriGeometryType.esriGeometryPoint && sourceGeoType == esriGeometryType.esriGeometryMultipoint)) { // Add the layer name to the combobox and the layer to the list cboInputData.Items.Add(sourceLayer.Name); m_listDisplayTable.Add(sourceDisplayTable); } } sourceLayer = sourceLayers.Next(); } } // The layer being loaded into has no geometry type else { // Find all of the standalone table that are not part of an NALayer IStandaloneTableCollection sourceStandaloneTables = mapControl.Map as IStandaloneTableCollection; IStandaloneTable sourceStandaloneTable = null; sourceDisplayTable = null; int count = 0; if (sourceStandaloneTables != null) count = sourceStandaloneTables.StandaloneTableCount; for (int i = 0; i < count; ++i) { sourceStandaloneTable = sourceStandaloneTables.get_StandaloneTable(i); sourceDisplayTable = sourceStandaloneTable as IDisplayTable; if ((sourceStandaloneTable != null) && (sourceDisplayTable != null)) { // Add the table name to the combobox and the layer to the list cboInputData.Items.Add(sourceStandaloneTable.Name); m_listDisplayTable.Add(sourceDisplayTable); } } // Find all of the standalone tables that are part of an NALayer searchInterfaceUID.Value = typeof(INALayer).GUID.ToString("B"); sourceLayers = mapControl.Map.get_Layers(searchInterfaceUID, true); sourceLayer = sourceLayers.Next(); while (sourceLayer != null) { INALayer sourceNALayer = sourceLayer as INALayer; if (sourceNALayer != null) { sourceStandaloneTables = sourceNALayer as IStandaloneTableCollection; sourceStandaloneTable = null; sourceDisplayTable = null; count = 0; if (sourceStandaloneTables != null) count = sourceStandaloneTables.StandaloneTableCount; for (int i = 0; i < count; ++i) { sourceStandaloneTable = sourceStandaloneTables.get_StandaloneTable(i); sourceDisplayTable = sourceStandaloneTable as IDisplayTable; if ((sourceStandaloneTable != null) && (sourceDisplayTable != null)) { // Add the table name to the combobox and the layer to the list cboInputData.Items.Add(sourceStandaloneTable.Name); m_listDisplayTable.Add(sourceDisplayTable); } } } sourceLayer = sourceLayers.Next(); } } } private void btnOK_Click(object sender, System.EventArgs e) { m_okClicked = true; this.Close(); } private void btnCancel_Click(object sender, System.EventArgs e) { m_okClicked = false; this.Close(); } private void cboInputData_SelectedIndexChanged(object sender, System.EventArgs e) { // Set the chkUseSelectedFeatures control based on if anything is selected or not if (cboInputData.SelectedIndex >= 0) { IDisplayTable displayTable = m_listDisplayTable[cboInputData.SelectedIndex] as IDisplayTable; chkUseSelection.Checked = (displayTable.DisplaySelectionSet.Count > 0); chkUseSelection.Enabled = (displayTable.DisplaySelectionSet.Count > 0); } } } }
[Visual Basic .NET]
frmLoadLocations.vb
Imports Microsoft.VisualBasic Imports System Imports ESRI.ArcGIS.Carto Imports ESRI.ArcGIS.Controls Imports ESRI.ArcGIS.esriSystem Imports ESRI.ArcGIS.Geodatabase Imports ESRI.ArcGIS.Geometry Imports ESRI.ArcGIS.NetworkAnalyst Imports System.Windows.Forms Imports System.Collections.Generic ' This form allows users to load locations from another point feature layer into the selected NALayer and active category. Namespace NAEngine Public Class frmLoadLocations : Inherits System.Windows.Forms.Form Private lblInputData As System.Windows.Forms.Label Private chkUseSelection As System.Windows.Forms.CheckBox Private WithEvents btnCancel As System.Windows.Forms.Button Private WithEvents btnOK As System.Windows.Forms.Button ''' <summary> ''' Required designer variable. ''' </summary> Private components As System.ComponentModel.Container = Nothing Private WithEvents cboInputData As System.Windows.Forms.ComboBox Private m_okClicked As Boolean Private m_listDisplayTable As System.Collections.IList Public Sub New() ' ' Required for Windows Form Designer support ' InitializeComponent() End Sub ''' <summary> ''' Clean up any resources being used. ''' </summary> Protected Overrides Overloads 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 #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 Sub InitializeComponent() Me.cboInputData = New System.Windows.Forms.ComboBox() Me.lblInputData = New System.Windows.Forms.Label() Me.chkUseSelection = New System.Windows.Forms.CheckBox() Me.btnCancel = New System.Windows.Forms.Button() Me.btnOK = New System.Windows.Forms.Button() Me.SuspendLayout() ' ' cboInputData ' Me.cboInputData.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList Me.cboInputData.Location = New System.Drawing.Point(82, 9) Me.cboInputData.Name = "cboInputData" Me.cboInputData.Size = New System.Drawing.Size(381, 21) Me.cboInputData.TabIndex = 0 ' Me.cboInputData.SelectedIndexChanged += New System.EventHandler(Me.cboInputData_SelectedIndexChanged); ' ' lblInputData ' Me.lblInputData.Location = New System.Drawing.Point(12, 12) Me.lblInputData.Name = "lblInputData" Me.lblInputData.Size = New System.Drawing.Size(64, 24) Me.lblInputData.TabIndex = 1 Me.lblInputData.Text = "Input Data" ' ' chkUseSelection ' Me.chkUseSelection.Location = New System.Drawing.Point(15, 39) Me.chkUseSelection.Name = "chkUseSelection" Me.chkUseSelection.Size = New System.Drawing.Size(419, 16) Me.chkUseSelection.TabIndex = 2 Me.chkUseSelection.Text = "Use Selection" ' ' btnCancel ' Me.btnCancel.Anchor = (CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)) Me.btnCancel.Location = New System.Drawing.Point(351, 61) Me.btnCancel.Name = "btnCancel" Me.btnCancel.Size = New System.Drawing.Size(112, 32) Me.btnCancel.TabIndex = 6 Me.btnCancel.Text = "&Cancel" ' Me.btnCancel.Click += New System.EventHandler(Me.btnCancel_Click); ' ' btnOK ' Me.btnOK.Anchor = (CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)) Me.btnOK.Location = New System.Drawing.Point(223, 61) Me.btnOK.Name = "btnOK" Me.btnOK.Size = New System.Drawing.Size(112, 32) Me.btnOK.TabIndex = 5 Me.btnOK.Text = "&OK" ' Me.btnOK.Click += New System.EventHandler(Me.btnOK_Click); ' ' frmLoadLocations ' Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13) Me.ClientSize = New System.Drawing.Size(479, 100) Me.Controls.Add(Me.btnCancel) Me.Controls.Add(Me.btnOK) Me.Controls.Add(Me.chkUseSelection) Me.Controls.Add(Me.lblInputData) Me.Controls.Add(Me.cboInputData) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog Me.Name = "frmLoadLocations" Me.ShowInTaskbar = False Me.Text = "Load Locations" Me.ResumeLayout(False) End Sub #End Region Public Function ShowModal(ByVal mapControl As IMapControl3, ByVal naEnv As IEngineNetworkAnalystEnvironment) As Boolean ' Initialize variables m_okClicked = False m_listDisplayTable = New System.Collections.ArrayList() Dim activeCategory As IEngineNAWindowCategory2 = TryCast(naEnv.NAWindow.ActiveCategory, IEngineNAWindowCategory2) If activeCategory Is Nothing Then Return False End If Dim dataLayer As IDataLayer = activeCategory.DataLayer If dataLayer Is Nothing Then Return False End If ' Set up the title of this dialog Dim dataLayerName As String = GetDataLayerName(dataLayer) If dataLayerName.Length = 0 Then Return False End If Me.Text = "Load Items into " & dataLayerName ' Make sure the combo box lists only the appropriate possible input data layers PopulateInputDataComboBox(mapControl, dataLayer) 'Select the first display table from the list If cboInputData.Items.Count > 0 Then cboInputData.SelectedIndex = 0 End If ' Show the window Me.ShowDialog() ' If we selected a layer and clicked OK, load the locations If m_okClicked AndAlso (cboInputData.SelectedIndex >= 0) Then Try ' Get a cursor on the source display table (either though the selection set or table) ' Use IDisplayTable because it accounts for joins, querydefs, etc. ' IDisplayTable is implemented by FeatureLayers and StandaloneTables. ' Dim displayTable As IDisplayTable = TryCast(m_listDisplayTable(cboInputData.SelectedIndex), IDisplayTable) Dim cursor As ICursor = Nothing If chkUseSelection.Checked Then Dim selSet As ISelectionSet selSet = displayTable.DisplaySelectionSet selSet.Search(Nothing, False, cursor) Else cursor = displayTable.SearchDisplayTable(Nothing, False) End If ' Get the NAContext from the active analysis layer Dim naContext As INAContext = naEnv.NAWindow.ActiveAnalysis.Context ' Get the dataset for the active NAClass Dim naDataset As IDataset = TryCast(activeCategory.NAClass, IDataset) ' Setup NAClassLoader and Load Locations Dim naClassLoader As INAClassLoader2 = TryCast(New NAClassLoader(), INAClassLoader2) naClassLoader.Initialize(naContext, naDataset.Name, cursor) ' Avoid loading network locations onto non-traversable portions of elements Dim locator As INALocator3 = TryCast(naContext.Locator, INALocator3) locator.ExcludeRestrictedElements = True locator.CacheRestrictedElements(naContext) Dim rowsIn As Integer = 0 Dim rowsLocated As Integer = 0 naClassLoader.Load(cursor, Nothing, rowsIn, rowsLocated) ' Let the user know if some of the rows failed to locate If rowsIn <> rowsLocated Then MessageBox.Show("Out of " & rowsIn & " + rows, " & rowsLocated & " rows were located", "Loading locations", MessageBoxButtons.OK, MessageBoxIcon.Information) End If Catch e As Exception MessageBox.Show(e.Message, "Loading locations failure", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try Return True End If Return False End Function Private Function GetDataLayerName(ByVal dataLayer As IDataLayer) As String Dim pFeatureLayer As IFeatureLayer = TryCast(dataLayer, IFeatureLayer) Dim pStandaloneTable As IStandaloneTable = TryCast(dataLayer, IStandaloneTable) Dim pLayer As ILayer = TryCast(dataLayer, ILayer) If Not pFeatureLayer Is Nothing AndAlso pLayer.Valid Then Return pLayer.Name ElseIf Not pStandaloneTable Is Nothing Then Return pStandaloneTable.Name End If Return "" End Function Private Function GetDataLayerGeometryType(ByVal dataLayer As IDataLayer) As esriGeometryType Dim pFeatureLayer As IFeatureLayer = TryCast(dataLayer, IFeatureLayer) Dim pLayer As ILayer = TryCast(dataLayer, ILayer) If Not pFeatureLayer Is Nothing AndAlso pLayer.Valid Then Dim pFeatureClass As IFeatureClass = pFeatureLayer.FeatureClass If Not pFeatureClass Is Nothing Then Return pFeatureClass.ShapeType End If End If Return esriGeometryType.esriGeometryNull End Function Private Sub PopulateInputDataComboBox(ByVal mapControl As IMapControl3, ByVal dataLayer As IDataLayer) Dim targetGeoType As esriGeometryType = GetDataLayerGeometryType(dataLayer) Dim sourceLayers As IEnumLayer = Nothing Dim sourceLayer As ILayer = Nothing Dim sourceDisplayTable As IDisplayTable = Nothing Dim searchInterfaceUID As UID = New UID() If targetGeoType <> esriGeometryType.esriGeometryNull Then ' Only include layers that are of type IFeatureLayer searchInterfaceUID.Value = GetType(IFeatureLayer).GUID.ToString("B") sourceLayers = mapControl.Map.Layers(searchInterfaceUID, True) ' iterate over all of the feature layers sourceLayer = sourceLayers.Next() Do While Not sourceLayer Is Nothing ' Verify that the layer is a feature layer and a display table Dim sourceFeatureLayer As IFeatureLayer = TryCast(sourceLayer, IFeatureLayer) sourceDisplayTable = TryCast(sourceLayer, IDisplayTable) If (Not sourceFeatureLayer Is Nothing) AndAlso (Not sourceDisplayTable Is Nothing) Then ' Make sure that the geometry of the feature layer matches the geometry ' of the class into which we are loading Dim sourceFeatureClass As IFeatureClass = sourceFeatureLayer.FeatureClass Dim sourceGeoType As esriGeometryType = sourceFeatureClass.ShapeType If (sourceGeoType = targetGeoType) OrElse (targetGeoType = esriGeometryType.esriGeometryPoint AndAlso sourceGeoType = esriGeometryType.esriGeometryMultipoint) Then ' Add the layer name to the combobox and the layer to the list cboInputData.Items.Add(sourceLayer.Name) m_listDisplayTable.Add(sourceDisplayTable) End If End If sourceLayer = sourceLayers.Next() Loop ' The layer being loaded into has no geometry type Else ' Find all of the standalone table that are not part of an NALayer Dim sourceStandaloneTables As IStandaloneTableCollection = TryCast(mapControl.Map, IStandaloneTableCollection) Dim sourceStandaloneTable As IStandaloneTable = Nothing sourceDisplayTable = Nothing Dim count As Integer = 0 If Not sourceStandaloneTables Is Nothing Then count = sourceStandaloneTables.StandaloneTableCount End If Dim i As Integer = 0 Do While i < count sourceStandaloneTable = sourceStandaloneTables.StandaloneTable(i) sourceDisplayTable = TryCast(sourceStandaloneTable, IDisplayTable) If (Not sourceStandaloneTable Is Nothing) AndAlso (Not sourceDisplayTable Is Nothing) Then ' Add the table name to the combobox and the layer to the list cboInputData.Items.Add(sourceStandaloneTable.Name) m_listDisplayTable.Add(sourceDisplayTable) End If i += 1 Loop ' Find all of the standalone tables that are part of an NALayer searchInterfaceUID.Value = GetType(INALayer).GUID.ToString("B") sourceLayers = mapControl.Map.Layers(searchInterfaceUID, True) sourceLayer = sourceLayers.Next() Do While Not sourceLayer Is Nothing Dim sourceNALayer As INALayer = TryCast(sourceLayer, INALayer) If Not sourceNALayer Is Nothing Then sourceStandaloneTables = TryCast(sourceNALayer, IStandaloneTableCollection) sourceStandaloneTable = Nothing sourceDisplayTable = Nothing count = 0 If Not sourceStandaloneTables Is Nothing Then count = sourceStandaloneTables.StandaloneTableCount End If i = 0 Do While i < count sourceStandaloneTable = sourceStandaloneTables.StandaloneTable(i) sourceDisplayTable = TryCast(sourceStandaloneTable, IDisplayTable) If (Not sourceStandaloneTable Is Nothing) AndAlso (Not sourceDisplayTable Is Nothing) Then ' Add the table name to the combobox and the layer to the list cboInputData.Items.Add(sourceStandaloneTable.Name) m_listDisplayTable.Add(sourceDisplayTable) End If i += 1 Loop End If sourceLayer = sourceLayers.Next() Loop End If End Sub Private Sub btnOK_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnOK.Click m_okClicked = True Me.Close() End Sub Private Sub btnCancel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCancel.Click m_okClicked = False Me.Close() End Sub Private Sub cboInputData_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cboInputData.SelectedIndexChanged ' Set the chkUseSelectedFeatures control based on if anything is selected or not If cboInputData.SelectedIndex >= 0 Then Dim displayTable As IDisplayTable = TryCast(m_listDisplayTable(cboInputData.SelectedIndex), IDisplayTable) chkUseSelection.Checked = (displayTable.DisplaySelectionSet.Count > 0) chkUseSelection.Enabled = (displayTable.DisplaySelectionSet.Count > 0) End If End Sub End Class End Namespace