ArcObjects Library Reference  

EditorForm

About the Editing using a custom form Sample

[C#]

EditorForm.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;

using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;

namespace EditingUsingCustomForm
{
    public partial class EditorForm : Form
    {

        #region private members
        private MainForm m_mainForm;
        private IMapControl3 m_mapControl;
        private ArrayList m_commands;
        private IEngineEditor m_engineEditor;
        private IOperationStack m_operationStack;
        private ICommandPool m_pool;
        #endregion

        public EditorForm()
        {
            InitializeComponent();
        }

        private void EditorForm_Load(object sender, EventArgs e)
        {
            //*********  Important *************
            //Obtain a reference to the MainForm using the EditHelper class
            m_mainForm = EditHelper.TheMainForm;
            m_mapControl = m_mainForm.MapControl;

            //buddy the toolbars with the MapControl 
            axBlankToolBar.SetBuddyControl(m_mapControl);
            axModifyToolbar.SetBuddyControl(m_mapControl);
            axReshapeToolbar.SetBuddyControl(m_mapControl);
            axUndoRedoToolbar.SetBuddyControl(m_mapControl);
            axCreateToolbar.SetBuddyControl(m_mapControl);

            //Create and share command pool
            m_pool = new CommandPoolClass();
            axCreateToolbar.CommandPool = m_pool;  
            axBlankToolBar.CommandPool = m_pool;
            axModifyToolbar.CommandPool = m_pool;
            axReshapeToolbar.CommandPool = m_pool;
            axUndoRedoToolbar.CommandPool = m_pool;

            //Create and share operation stack
            m_operationStack = new ControlsOperationStackClass();
            axModifyToolbar.OperationStack = m_operationStack;
            axReshapeToolbar.OperationStack = m_operationStack;
            axUndoRedoToolbar.OperationStack = m_operationStack;
            axCreateToolbar.OperationStack = m_operationStack;

            //load items for the axModifyToolbar
            axModifyToolbar.AddItem("esriControls.ControlsEditingEditTool", 0, 0, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
            axModifyToolbar.AddItem("VertexCommands_CS.CustomVertexCommands", 1, 1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
            axModifyToolbar.AddItem("VertexCommands_CS.CustomVertexCommands", 2, 2, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

            //load items for the axReshapeToolbar
            axReshapeToolbar.AddItem("esriControls.ControlsEditingEditTool", 0, 0, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
            axReshapeToolbar.AddItem("esriControls.ControlsEditingSketchTool", 0, 1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

            //load items for the axCreateToolbar
            axCreateToolbar.AddItem("esriControls.ControlsEditingSketchTool", 0, 0, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

            //set up the EngineEditor
            m_engineEditor = new EngineEditorClass();
            m_engineEditor.EnableUndoRedo(true);
            ((IEngineEditProperties2)m_engineEditor).StickyMoveTolerance = 10000;
            object tbr = (object)axCreateToolbar.Object;
            IExtension engineEditorExt = m_engineEditor as IExtension;
            engineEditorExt.Startup(ref tbr); //ensures that the operationStack will function correctly

            //Listen to OnSketchModified engine editor event
            ((IEngineEditEvents_Event)m_engineEditor).OnSketchModified += new IEngineEditEvents_OnSketchModifiedEventHandler(OnSketchModified);
            //listen to MainForm events in case application is closed while editing
            EditHelper.TheMainForm.FormClosing += new FormClosingEventHandler(TheMainForm_FormClosing);

            #region Form Management
            m_commands = new ArrayList();
            m_commands.Add(cmdModify);
            m_commands.Add(cmdReshape);
            m_commands.Add(cmdCreate);
            
            DisableButtons();
            txtInfo.Text = "";
            this.Size = new Size(242, 208);
            this.FormBorderStyle = FormBorderStyle.FixedSingle;
            SetErrorLabel("");
            EditHelper.IsEditorFormOpen = true;
            #endregion
        }

        private void cmdCreate_Click(object sender, EventArgs e)
        {
            IEngineEditTask edittask = m_engineEditor.GetTaskByUniqueName("ControlToolsEditing_CreateNewFeatureTask");
  
            if (edittask != null)
            {
                m_engineEditor.CurrentTask = edittask;
                axCreateToolbar.CurrentTool = axCreateToolbar.GetItem(0).Command as ITool;
                
                SetButtonColors(sender as Button);
                txtInfo.Text = "";
                label1.Text = "";
                this.flowLayoutPanel1.Controls.Clear();
                this.flowLayoutPanel1.Controls.Add(axCreateToolbar);
                this.flowLayoutPanel2.Controls.Clear();
                this.flowLayoutPanel2.Controls.Add(axUndoRedoToolbar);
            }
        }

        private void cmdModify_Click(object sender, EventArgs e)
        {
            IEngineEditTask edittask = m_engineEditor.GetTaskByUniqueName("ControlToolsEditing_ModifyFeatureTask");
  
            if (edittask != null)
            {       
                m_engineEditor.CurrentTask = edittask;
                axModifyToolbar.CurrentTool = axModifyToolbar.GetItem(0).Command as ITool;
                
                SetButtonColors(sender as Button);
                txtInfo.Text = "";
                label1.Text = "";
                this.flowLayoutPanel1.Controls.Clear();
                this.flowLayoutPanel1.Controls.Add(axModifyToolbar);
                this.flowLayoutPanel2.Controls.Clear();
                this.flowLayoutPanel2.Controls.Add(axUndoRedoToolbar);
            }
        }

        private void cmdReshape_Click(object sender, EventArgs e)
        {
            IEngineEditTask edittask = m_engineEditor.GetTaskByUniqueName("ReshapePolylineEditTask_Reshape Polyline_CSharp");
  
            if (edittask != null)
            {
                m_engineEditor.CurrentTask = edittask;
                axReshapeToolbar.CurrentTool = axReshapeToolbar.GetItem(0).Command as ITool;

                SetButtonColors(sender as Button);
                txtInfo.Text = "";
                label1.Text = "";
                this.flowLayoutPanel1.Controls.Clear();
                this.flowLayoutPanel1.Controls.Add(axReshapeToolbar);
                this.flowLayoutPanel2.Controls.Clear();
                this.flowLayoutPanel2.Controls.Add(axUndoRedoToolbar);
            }
        }

        private void cmdEdit_Click(object sender, EventArgs e)
        {
            if (cmdEdit.Text == "Edit")
            {
                IFeatureLayer featlayer = FindFeatureLayer("usa_major_highways");

                if (featlayer != null)
                {
                    m_engineEditor.StartEditing(((IDataset)featlayer.FeatureClass).Workspace, m_mapControl.Map);
                    IEngineEditLayers editLayer = (IEngineEditLayers)m_engineEditor;
                    editLayer.SetTargetLayer(featlayer,0);
                    EnableButtons();

                    cmdEdit.Text = "Finish";
                    Color color = Color.Red;
                    cmdEdit.BackColor = color;
                    cmdCreate_Click(cmdCreate, null);
                }
            }
            else
            {
                SaveEdits();
                DisableButtons();
                cmdEdit.Text = "Edit";
                Color color = Color.White;
                cmdEdit.BackColor = color;
                SetErrorLabel("");
            }
        }
        
        private void EditorForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            CleanupOnFormClose();
        }

        void TheMainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            CleanupOnFormClose();
        }

        void OnSketchModified()
        {
            if (IsHighwaysEditValid)
            {
                SetErrorLabel("");
            }
            else
            {
                m_operationStack.Undo();
                SetErrorLabel("Invalid Edit");
            }
        }


        #region private form and button management

        private void SetSelectableLayerStatus(bool enable)
        {
            IMap map = m_mapControl.Map;
            
            for (int i = 0; i < map.LayerCount - 1; i++)
            {
                IFeatureLayer layer = (IFeatureLayer)map.get_Layer(i);
                layer.Selectable = enable;
            }
        }

        private void SetErrorLabel(string message)
        {
            label1.Text = message;
        }

        private void DisableButtons()
        {
            cmdReshape.Enabled = false;
            cmdCreate.Enabled = false;
            cmdModify.Enabled = false;

            foreach (Button button in m_commands)
            {
                Color color = Color.White;
                button.BackColor = color;
            }
        }

        private void EnableButtons()
        {
            cmdReshape.Enabled = true;
            cmdCreate.Enabled = true;
            cmdModify.Enabled = true;
        }

        private void SetButtonColors(Button clickedButton)
        {
            Color color;

            foreach (Button button in m_commands)
            {
                if (clickedButton == button)
                {
                    color = Color.ForestGreen;
                }
                else
                {
                    color = Color.White;
                }

                button.BackColor = color;
            }
        }

        private void SetInfoLabel(object sender, int index)
        {
            AxToolbarControl toolbarControl = sender as AxToolbarControl;
            IToolbarControl2 toolbar = toolbarControl.Object as IToolbarControl2;
            IToolbarItem item = toolbar.GetItem(index);
            ICommand command = item.Command;
            txtInfo.Text = command.Message;
        }

        private void axModifyToolbar_OnItemClick(object sender, IToolbarControlEvents_OnItemClickEvent e)
        {

            SetInfoLabel(sender, e.index);
        }

        private void axReshapeToolbar_OnItemClick(object sender, IToolbarControlEvents_OnItemClickEvent e)
        {
            SetInfoLabel(sender, e.index);
        }

        #endregion

        #region private helper methods/properties

        private void CleanupOnFormClose()
        {
            if (m_engineEditor.EditState == esriEngineEditState.esriEngineStateEditing)
            {
                SaveEdits();
            }

            EditHelper.IsEditorFormOpen = false;

            //unregister the event handlers
            ((IEngineEditEvents_Event)m_engineEditor).OnSketchModified -= new IEngineEditEvents_OnSketchModifiedEventHandler(OnSketchModified);
            EditHelper.TheMainForm.FormClosing -= new FormClosingEventHandler(TheMainForm_FormClosing);
            
        }

        private void SaveEdits()
        {
            bool saveEdits = false;

            if (m_engineEditor.HasEdits())
            {
                string message = "Do you wish to save your edits?";
                string caption = "Save Edits";
                MessageBoxButtons buttons = MessageBoxButtons.YesNo;
                DialogResult result;

                result = MessageBox.Show(message, caption, buttons);

                if (result == DialogResult.Yes)
                {
                    saveEdits = true;
                }
            }

            m_engineEditor.StopEditing(saveEdits);
        }

       
        private IFeatureLayer FindFeatureLayer(string name)
        {
            
            IFeatureLayer foundLayer = null;
            IDataset dataset = null;
            IMap map = m_mapControl.Map;
            
            for (int i = 0; i < map.LayerCount; i++)
            {
                IFeatureLayer layer = (IFeatureLayer)map.get_Layer(i);
                dataset = (IDataset)layer.FeatureClass;
                if (dataset.Name == name)
                {
                    foundLayer = layer;
                    break;
                }
            }

            return foundLayer;
        }


        private bool IsHighwaysEditValid
        {
            get
            {
                //put in all business logic here
                //In this example highways are not allowed to intersect the lakes layer
                bool success = true;

                //get the edit sketch
                IEngineEditSketch editsketch = (IEngineEditSketch)m_engineEditor;

                //get the protected areas layer
                IFeatureLayer lakesLayer = FindFeatureLayer("us_lakes");
               
                //do a spatial filter 
                if ((editsketch != null) && (lakesLayer != null) && (editsketch.Geometry !=null))
                {
                    IFeatureCursor cursor = FindFeatures(editsketch.Geometry, lakesLayer.FeatureClass, esriSpatialRelEnum.esriSpatialRelIntersects, m_mapControl.Map);
                    IFeature feature = cursor.NextFeature();

                    //could put more sophisticated logic in here
                    if (feature != null)
                        success = false;
                }

                return success;
            }

        }

        private IFeatureCursor FindFeatures(IGeometry geometry, IFeatureClass featureClass, esriSpatialRelEnum spatialRelationship, IMap map)
        {      
            //1 = esriSpatialRelIntersects
            //7 = esriSpatialWithin
            //8 = esriSpatialRelContains

            ISpatialFilter spatialFilter = new SpatialFilter();
            spatialFilter.Geometry = geometry;
            spatialFilter.set_OutputSpatialReference(featureClass.ShapeFieldName, map.SpatialReference);
            spatialFilter.GeometryField = featureClass.ShapeFieldName;
            spatialFilter.SpatialRel = spatialRelationship;

            IFeatureCursor featureCursor = featureClass.Search(spatialFilter, false);
            return featureCursor;
        }

        #endregion

    }
}
[Visual Basic .NET]

EditorForm.vb


Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Text
Imports System.Windows.Forms
Imports System.Collections

Imports ESRI.ArcGIS.Controls
Imports ESRI.ArcGIS.SystemUI
Imports ESRI.ArcGIS.esriSystem
Imports ESRI.ArcGIS.Carto
Imports ESRI.ArcGIS.Geodatabase
Imports ESRI.ArcGIS.Geometry


Public Class EditorForm

#Region "private members"
    Private m_mainForm As MainForm
    Private m_mapControl As IMapControl3
    Private m_commands As ArrayList
    Private m_engineEditor As IEngineEditor
    Private m_operationStack As IOperationStack
    Private m_pool As ICommandPool
#End Region

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

        '*********  Important *************
        ' Obtain a reference to the MainForm using the EditHelper class
        m_mainForm = EditHelper.TheMainForm
        m_mapControl = m_mainForm.MapControl

        axBlankToolBar.SetBuddyControl(m_mapControl)
        axModifyToolbar.SetBuddyControl(m_mapControl)
        axReshapeToolbar.SetBuddyControl(m_mapControl)
        axUndoRedoToolbar.SetBuddyControl(m_mapControl)
        axCreateToolbar.SetBuddyControl(m_mapControl)

        'create and share CommandPool
        m_pool = New CommandPool()
        axCreateToolbar.CommandPool = m_pool
        axBlankToolBar.CommandPool = m_pool
        axModifyToolbar.CommandPool = m_pool
        axReshapeToolbar.CommandPool = m_pool
        axUndoRedoToolbar.CommandPool = m_pool

        'Create and share operation stack
        m_operationStack = New ControlsOperationStackClass()
        axModifyToolbar.OperationStack = m_operationStack
        axReshapeToolbar.OperationStack = m_operationStack
        axUndoRedoToolbar.OperationStack = m_operationStack
        axCreateToolbar.OperationStack = m_operationStack

        'load items for the axModifyToolbar
        axModifyToolbar.AddItem("esriControls.ControlsEditingEditTool", 0, 0, False, 0, esriCommandStyles.esriCommandStyleIconOnly)
        axModifyToolbar.AddItem("VertexCommands_CS.CustomVertexCommands", 1, 1, False, 0, esriCommandStyles.esriCommandStyleIconOnly)
        axModifyToolbar.AddItem("VertexCommands_CS.CustomVertexCommands", 2, 2, False, 0, esriCommandStyles.esriCommandStyleIconOnly)

        'load items for the axReshapeToolbar
        axReshapeToolbar.AddItem("esriControls.ControlsEditingEditTool", 0, 0, False, 0, esriCommandStyles.esriCommandStyleIconOnly)
        axReshapeToolbar.AddItem("esriControls.ControlsEditingSketchTool", 0, 1, False, 0, esriCommandStyles.esriCommandStyleIconOnly)

        'load items for the createtoolbar 
        axCreateToolbar.AddItem("esriControls.ControlsEditingSketchTool", 0, 0, False, 0, esriCommandStyles.esriCommandStyleIconOnly)

        'set up the EngineEditor
        m_engineEditor = New EngineEditorClass()
        m_engineEditor.EnableUndoRedo(True)
        CType(m_engineEditor, IEngineEditProperties2).StickyMoveTolerance = 10000
        Dim tbr As Object = axCreateToolbar.Object
        Dim engineEditorExt As IExtension = CType(m_engineEditor, IExtension)
        engineEditorExt.Startup(tbr) 'ensures that the operationStack will function correctly

        'Listen to OnSketchModified engine editor event
        AddHandler (CType(m_engineEditor, IEngineEditEvents_Event)).OnSketchModified, AddressOf OnSketchModified
        'listen to MainForm events in case application is closed while editing
        AddHandler EditHelper.TheMainForm.FormClosing, AddressOf MainForm_FormClosing

        m_commands = New ArrayList()
        m_commands.Add(cmdModify)
        m_commands.Add(cmdReshape)
        m_commands.Add(cmdCreate)

        DisableButtons()
        txtInfo.Text = ""
        Me.Size = New Size(242, 208)
        Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedSingle
        SetErrorLabel("")
        EditHelper.IsEditorFormOpen = True

    End Sub

    Private Sub cmdCreate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCreate.Click

        Dim edittask As IEngineEditTask = m_engineEditor.GetTaskByUniqueName("ControlToolsEditing_CreateNewFeatureTask")

        If Not edittask Is Nothing Then
            m_engineEditor.CurrentTask = edittask
            axCreateToolbar.CurrentTool = axCreateToolbar.GetItem(0).Command

            SetButtonColours(sender)
            txtInfo.Text = ""
            label1.Text = ""
            Me.flowLayoutPanel1.Controls.Clear()
            Me.flowLayoutPanel1.Controls.Add(axCreateToolbar)
            Me.flowLayoutPanel2.Controls.Clear()
            Me.flowLayoutPanel2.Controls.Add(axUndoRedoToolbar)
        End If

    End Sub

    Private Sub cmdModify_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdModify.Click

        Dim edittask As IEngineEditTask = m_engineEditor.GetTaskByUniqueName("ControlToolsEditing_ModifyFeatureTask")

        If Not edittask Is Nothing Then
            m_engineEditor.CurrentTask = edittask
            axModifyToolbar.CurrentTool = axModifyToolbar.GetItem(0).Command

            SetButtonColours(sender)
            txtInfo.Text = ""
            label1.Text = ""
            Me.flowLayoutPanel1.Controls.Clear()
            Me.flowLayoutPanel1.Controls.Add(axModifyToolbar)
            Me.flowLayoutPanel2.Controls.Clear()
            Me.flowLayoutPanel2.Controls.Add(axUndoRedoToolbar)
        End If

    End Sub

    Private Sub cmdReshape_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdReshape.Click

        Dim edittask As IEngineEditTask = m_engineEditor.GetTaskByUniqueName("ReshapePolylineEditTask_Reshape Polyline_CSharp")

        If Not edittask Is Nothing Then
            m_engineEditor.CurrentTask = edittask
            axReshapeToolbar.CurrentTool = axReshapeToolbar.GetItem(0).Command

            SetButtonColours(sender)
            txtInfo.Text = ""
            label1.Text = ""
            Me.flowLayoutPanel1.Controls.Clear()
            Me.flowLayoutPanel1.Controls.Add(axReshapeToolbar)
            Me.flowLayoutPanel2.Controls.Clear()
            Me.flowLayoutPanel2.Controls.Add(axUndoRedoToolbar)
        End If

    End Sub

    Private Sub cmdEdit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdEdit.Click
        If cmdEdit.Text = "Edit" Then
            Dim featlayer As IFeatureLayer = FindFeatureLayer("usa_major_highways")

            If Not featlayer Is Nothing Then
                m_engineEditor.StartEditing((CType(featlayer.FeatureClass, IDataset)).Workspace, m_mapControl.Map)
                Dim editLayer As IEngineEditLayers = CType(m_engineEditor, IEngineEditLayers)
                editLayer.SetTargetLayer(featlayer, 0)
                EnableButtons()

                cmdEdit.Text = "Finish"
                Dim color As Color = color.Red
                cmdEdit.BackColor = color
                cmdCreate_Click(cmdCreate, Nothing)
            End If
        Else
            SaveEdits()
            DisableButtons()
            cmdEdit.Text = "Edit"
            Dim color As Color = color.White
            cmdEdit.BackColor = color
            SetErrorLabel("")
        End If

    End Sub

    Private Sub EditorForm_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        CleanupOnFormClose()
    End Sub

    Private Sub MainForm_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        CleanupOnFormClose()
    End Sub

    Private Sub OnSketchModified()
        If (IsHighwaysEditValid) Then
            SetErrorLabel("")
        Else
            m_operationStack.Undo()
            SetErrorLabel("Invalid Edit")
        End If

    End Sub


#Region "private form and button management"


    Private Sub SetSelectableLayerStatus(ByVal enable As Boolean)
        Dim map As IMap = m_mapControl.Map
        'get the workspace to edit
        Dim i As Integer
        For i = 0 To map.LayerCount - 1 - 1 Step i + 1
            Dim layer As IFeatureLayer = CType(map.get_Layer(i), IFeatureLayer)
            layer.Selectable = enable

        Next
    End Sub


    Private Sub SetErrorLabel(ByVal message As String)
        label1.Text = message
    End Sub

    Private Sub DisableButtons()
        cmdReshape.Enabled = False
        cmdCreate.Enabled = False
        cmdModify.Enabled = False

        Dim button As Button
        For Each button In m_commands
            Dim color As Color = Color.White
            button.BackColor = color
        Next
    End Sub

    Private Sub EnableButtons()
        cmdReshape.Enabled = True
        cmdCreate.Enabled = True
        cmdModify.Enabled = True
    End Sub

    Private Sub SetButtonColours(ByVal clickedButton As Button)

        Dim color As Color

        Dim button As Button
        For Each button In m_commands
            If clickedButton Is button Then
                color = color.ForestGreen
            Else
                color = color.White
            End If

            button.BackColor = color

        Next
    End Sub

    Private Sub SetInfoLabel(ByVal sender As Object, ByVal index As Integer)
        Dim toolbarControl As AxToolbarControl = sender
        Dim toolbar As IToolbarControl2 = CType(toolbarControl.Object, IToolbarControl2)
        Dim item As IToolbarItem = toolbar.GetItem(index)
        Dim command As ICommand = item.Command
        txtInfo.Text = command.Message
    End Sub

    Private Sub axModifyToolbar_OnItemClick(ByVal sender As Object, ByVal e As IToolbarControlEvents_OnItemClickEvent)

        SetInfoLabel(sender, e.index)
    End Sub

    Private Sub axReshapeToolbar_OnItemClick(ByVal sender As Object, ByVal e As IToolbarControlEvents_OnItemClickEvent)
        SetInfoLabel(sender, e.index)
    End Sub

#End Region

#Region "private helper methods/properties"

    Private Sub CleanupOnFormClose()

        If (m_engineEditor.EditState = esriEngineEditState.esriEngineStateEditing) Then

            SaveEdits()
        End If

        EditHelper.IsEditorFormOpen = False

        'unregister the event handler
        RemoveHandler (CType(m_engineEditor, IEngineEditEvents_Event)).OnSketchModified, AddressOf OnSketchModified

    End Sub

    Private Sub SaveEdits()

        Dim saveEdits As Boolean = False

        If (m_engineEditor.HasEdits()) Then

            Dim message As String = "Do you wish to save edits?"
            Dim caption As String = "Save Edits"
            Dim buttons As MessageBoxButtons = MessageBoxButtons.YesNo
            Dim result As DialogResult

            result = MessageBox.Show(message, caption, buttons)

            If (result = DialogResult.Yes) Then
                saveEdits = True

            End If

            m_engineEditor.StopEditing(saveEdits)
        End If
    End Sub


    Private Function FindFeatureLayer(ByVal name As String) As IFeatureLayer

        Dim foundLayer As IFeatureLayer = Nothing
        Dim dataset As IDataset = Nothing
        Dim map As IMap = m_mapControl.Map

        Dim i As Integer
        For i = 0 To map.LayerCount - 1 Step i + 1
            Dim layer As IFeatureLayer = CType(map.Layer(i), IFeatureLayer)
            dataset = CType(layer.FeatureClass, IDataset)
            If (dataset.Name = name) Then

                foundLayer = layer
                Exit For
            End If

        Next

        Return foundLayer
    End Function


    Private ReadOnly Property IsHighwaysEditValid() As Boolean
        Get
            'put in all business logic here
            'In this example highways are not allowed to intersect the lakes layer
            Dim success As Boolean = True

            'get the edit sketch
            Dim editsketch As IEngineEditSketch = CType(m_engineEditor, IEngineEditSketch)

            'get the protected areas layer
            Dim lakesLayer As IFeatureLayer = FindFeatureLayer("us_lakes")

            'do a spatial filter 
            If Not editsketch Is Nothing And Not lakesLayer Is Nothing And Not editsketch.Geometry Is Nothing Then

                Dim cursor As IFeatureCursor = FindFeatures(editsketch.Geometry, lakesLayer.FeatureClass, esriSpatialRelEnum.esriSpatialRelIntersects, m_mapControl.Map)
                Dim feat As IFeature = cursor.NextFeature()

                'could put more sophisticated logic in here
                If Not feat Is Nothing Then
                    success = False
                End If

            End If
            Return success
        End Get
    End Property

    Private Function FindFeatures(ByVal geomeTry As IGeometry, ByVal featureClass As IFeatureClass, ByVal spatialRelationship As esriSpatialRelEnum, ByVal map As IMap) As IFeatureCursor

        Try
            '1 = esriSpatialRelIntersects
            '7 = esriSpatialWithin
            '8 = esriSpatialRelContains

            Dim spatialFilter As ISpatialFilter = New SpatialFilter()
            spatialFilter.Geometry = geomeTry
            spatialFilter.GeometryField = featureClass.ShapeFieldName
            spatialFilter.SpatialRel = spatialRelationship

            Dim featureCursor As IFeatureCursor = featureClass.Search(spatialFilter, False)
            Return featureCursor
        Catch ex As Exception
            System.Diagnostics.Debug.WriteLine(ex.Message)
            Return Nothing
        End Try
    End Function

#End Region

End Class