About the Add-in custom editor extension Sample
[C#]
ValidateFeaturesExtension.cs
using System; using System.Collections.Generic; using System.Text; using System.IO; using ESRI.ArcGIS.Editor; using ESRI.ArcGIS.Geodatabase; namespace AddInEditorExtension { /// <summary> /// ValidateFeaturesExtension class implementing custom ESRI Editor Extension functionalities. /// </summary> public class ValidateFeaturesExtension : ESRI.ArcGIS.Desktop.AddIns.Extension { public ValidateFeaturesExtension() { } //Invoked when the Editor Extension is loaded protected override void OnStartup() { Events.OnStartEditing += new IEditEvents_OnStartEditingEventHandler(Events_OnStartEditing); Events.OnStopEditing += new IEditEvents_OnStopEditingEventHandler(Events_OnStopEditing); } //Invoked at the Start of editor session void Events_OnStartEditing() { //Since features of shapefiles, coverages etc cannot be validated, ignore wiring events for them if (ArcMap.Editor.EditWorkspace.Type != esriWorkspaceType.esriFileSystemWorkspace) { //wire OnCreateFeature Edit event Events.OnCreateFeature += new IEditEvents_OnCreateFeatureEventHandler(Events_OnCreateChangeFeature); //wire onChangeFeature Edit Event Events.OnChangeFeature += new IEditEvents_OnChangeFeatureEventHandler(Events_OnCreateChangeFeature); } } //Invoked at the end of Editor session (Editor->Stop Editing) void Events_OnStopEditing(bool Save) { //Since features of shapefiles, coverages etc cannot be validated, ignore wiring events for them if (ArcMap.Editor.EditWorkspace.Type != esriWorkspaceType.esriFileSystemWorkspace) { //unwire OnCreateFeature Edit event Events.OnCreateFeature -= new IEditEvents_OnCreateFeatureEventHandler(Events_OnCreateChangeFeature); //unwire onChangeFeature Edit Event Events.OnChangeFeature -= new IEditEvents_OnChangeFeatureEventHandler(Events_OnCreateChangeFeature); } } void Events_OnCreateChangeFeature(ESRI.ArcGIS.Geodatabase.IObject obj) { IFeature inFeature = (IFeature)obj; if (inFeature.Class is IValidation) { IValidate validate = (IValidate)inFeature; string errorMessage; //Validates connectivity rules, relationship rules, topology rules etc bool bIsvalid = validate.Validate(out errorMessage); if (!bIsvalid) { System.Windows.Forms.MessageBox.Show("Invalid Feature\n\n" + errorMessage); } else { System.Windows.Forms.MessageBox.Show("Valid Feature"); } } } protected override void OnShutdown() { } #region Editor Events #region Shortcut properties to the various editor event interfaces private IEditEvents_Event Events { get { return ArcMap.Editor as IEditEvents_Event; } } private IEditEvents2_Event Events2 { get { return ArcMap.Editor as IEditEvents2_Event; } } private IEditEvents3_Event Events3 { get { return ArcMap.Editor as IEditEvents3_Event; } } private IEditEvents4_Event Events4 { get { return ArcMap.Editor as IEditEvents4_Event; } } #endregion void WireEditorEvents() { // // TODO: Sample code demonstrating editor event wiring // Events.OnCurrentTaskChanged += delegate { if (ArcMap.Editor.CurrentTask != null) System.Windows.Forms.MessageBox.Show(ArcMap.Editor.CurrentTask.Name); }; Events2.BeforeStopEditing += delegate(bool save) { OnBeforeStopEditing(save); }; } void OnBeforeStopEditing(bool save) { } #endregion } }
[Visual Basic .NET]
ValidateFeaturesExtension.vb
Imports Microsoft.VisualBasic Imports System Imports System.Collections.Generic Imports System.Text Imports System.IO Imports ESRI.ArcGIS.Editor Imports ESRI.ArcGIS.Geodatabase Namespace AddInEditorExtension ''' <summary> ''' ValidateFeaturesExtension class implementing custom ESRI Editor Extension functionalities. ''' </summary> Public Class ValidateFeaturesExtension Inherits ESRI.ArcGIS.Desktop.AddIns.Extension Public Sub New() End Sub 'Invoked when the Editor Extension is loaded Protected Overrides Sub OnStartup() AddHandler Events.OnStartEditing, AddressOf Events_OnStartEditing AddHandler Events.OnStopEditing, AddressOf Events_OnStopEditing End Sub 'Invoked at the start of the Editor Session Private Sub Events_OnStartEditing() 'Since features of shapefiles, coverages etc cannot be validated, ignore wiring events for them If ArcMap.Editor.EditWorkspace.Type <> esriWorkspaceType.esriFileSystemWorkspace Then 'wire OnCreateFeature Edit event AddHandler Events.OnCreateFeature, AddressOf Events_OnCreateChangeFeature 'wire onChangeFeature Edit Event AddHandler Events.OnChangeFeature, AddressOf Events_OnCreateChangeFeature End If End Sub 'Invoked at the end of the Edit session Private Sub Events_OnStopEditing(ByVal Save As Boolean) 'Since features of shapefiles, coverages etc cannot be validated, ignore wiring events for them If ArcMap.Editor.EditWorkspace.Type <> esriWorkspaceType.esriFileSystemWorkspace Then 'unwire OnCreateFeature Edit event RemoveHandler Events.OnCreateFeature, AddressOf Events_OnCreateChangeFeature 'unwire onChangeFeature Edit Event RemoveHandler Events.OnChangeFeature, AddressOf Events_OnCreateChangeFeature End If End Sub 'Invoked when a feature is created or modified Private Sub Events_OnCreateChangeFeature(ByVal obj As ESRI.ArcGIS.Geodatabase.IObject) Dim inFeature As IFeature = CType(obj, IFeature) If TypeOf inFeature.Class Is IValidation Then Dim validate As IValidate = CType(inFeature, IValidate) Dim errorMessage As String Dim bIsvalid As Boolean = validate.Validate(errorMessage) If (Not bIsvalid) Then System.Windows.Forms.MessageBox.Show("Invalid Feature" & Constants.vbLf + Constants.vbLf & errorMessage) Else System.Windows.Forms.MessageBox.Show("Valid Feature") End If End If End Sub Protected Overrides Sub OnShutdown() End Sub #Region "Editor Events" #Region "Shortcut properties to the various editor event interfaces" Private ReadOnly Property Events() As IEditEvents_Event Get Return TryCast(ArcMap.Editor, IEditEvents_Event) End Get End Property Private ReadOnly Property Events2() As IEditEvents2_Event Get Return TryCast(ArcMap.Editor, IEditEvents2_Event) End Get End Property Private ReadOnly Property Events3() As IEditEvents3_Event Get Return TryCast(ArcMap.Editor, IEditEvents3_Event) End Get End Property Private ReadOnly Property Events4() As IEditEvents4_Event Get Return TryCast(ArcMap.Editor, IEditEvents4_Event) End Get End Property #End Region Private Sub WireEditorEvents() ' ' TODO: Sample code demonstrating editor event wiring ' AddHandler Events.OnCurrentTaskChanged, AddressOf AnonymousMethod1 AddHandler Events2.BeforeStopEditing, AddressOf AnonymousMethod2 End Sub Private Sub AnonymousMethod1() If ArcMap.Editor.CurrentTask IsNot Nothing Then System.Windows.Forms.MessageBox.Show(ArcMap.Editor.CurrentTask.Name) End If End Sub Private Sub AnonymousMethod2(ByVal save As Boolean) OnBeforeStopEditing(save) End Sub Private Sub OnBeforeStopEditing(ByVal save As Boolean) End Sub #End Region End Class End Namespace