// Attach an event handler to receive notifications when a row in the selected // table is changed. The subscription targets the first <see cref="ArcGIS.Desktop.Mapping.FeatureLayer"/> found in // the active map. Use this method to monitor and respond to edits made to table records within the current map // context. Table thisTable = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault().GetTable(); RowChangedEvent.Subscribe(rowChangedEventArgs => { // set the current row changed guid when you execute the Row.Store method // used for re-entry checking Guid _currentRowChangedGuid = new(); // RowEvent callbacks are always called on the QueuedTask so there is no need // to wrap your code within a QueuedTask.Run lambda. var row = rowChangedEventArgs.Row; // check for re-entry (only if row.Store is called) if (_currentRowChangedGuid == rowChangedEventArgs.Guid) return; var fldIdx = row.FindField("POLICE_DISTRICT"); if (fldIdx != -1) { //Validate any change to �police district� // cancel the edit if validation on the field fails if (row.HasValueChanged(fldIdx)) { // cancel edit with invalid district (5) var value = row["POLICE_DISTRICT"].ToString(); if (value == "5") { //Cancel edits with invalid �police district� values rowChangedEventArgs.CancelEdit($"Police district {row["POLICE_DISTRICT"]} is invalid"); } } // update the description field row["Description"] = "Row Changed"; // this update with cause another OnRowChanged event to occur // keep track of the row guid to avoid recursion _currentRowChangedGuid = rowChangedEventArgs.Guid; row.Store(); _currentRowChangedGuid = Guid.Empty; } }, thisTable);
// Set up a listener for row change events on the table associated with the // provided feature layer. The event subscription occurs within a queued task to ensure thread safety. await QueuedTask.Run(() => { //Listen to the RowChangedEvent that occurs when a Row is changed. var modifiedFeatureLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault(); ; RowChangedEvent.Subscribe(rowChangedEventArgs => { // RowEvent callbacks are always called on the QueuedTask so there is no need // to wrap your code within a QueuedTask.Run lambda. //Get the layer's definition var lyrDefn = modifiedFeatureLayer.GetFeatureClass().GetDefinition(); //Get the shape field of the feature class string shapeField = lyrDefn.GetShapeField(); //Index of the shape field var shapeIndex = lyrDefn.FindField(shapeField); //Original geometry of the modified row var geomOrig = rowChangedEventArgs.Row.GetOriginalValue(shapeIndex) as Geometry; //New geometry of the modified row var geomNew = rowChangedEventArgs.Row[shapeIndex] as Geometry; //Compare the two bool shapeChanged = geomOrig.IsEqual(geomNew); if (shapeChanged) { // The geometry has not changed Console.WriteLine("Geometry has not changed"); } else { // The geometry has changed Console.WriteLine("Geometry has changed"); } }, modifiedFeatureLayer.GetTable()); });
Target Platforms: Windows 11 Home, Pro, Enterprise (64 bit)