ArcGIS Pro 3.7 API Reference Guide
ArcGIS.Desktop.Editing Namespace / EditOperation Class / Modify Method / Modify(Row,String,Object) Method
The row to update.
The field name to update.
The new value.
Example

In This Topic
    Modify(Row,String,Object) Method
    In This Topic
    Modify a row, updating the attribute values. This method must be called on the MCT. Use QueuedTask.Run.
    Syntax
    Public Overloads Sub Modify( _
       ByVal row As Row, _
       ByVal fieldName As String, _
       ByVal value As Object _
    ) 
    public void Modify( 
       Row row,
       string fieldName,
       object value
    )

    Parameters

    row
    The row to update.
    fieldName
    The field name to update.
    value
    The new value.
    Exceptions
    ExceptionDescription
    This method or property must be called within the lambda passed to QueuedTask.Run.
    Example
    Edit Operation Modify single feature
    // Modifies a single feature in the specified feature layer.
    await QueuedTask.Run(() =>
      {
        var modifyFeature = new EditOperation() { Name = "Modify a feature" };
    
        //use an inspector
        var modifyInspector = new Inspector();
        modifyInspector.Load(featureLayer, objectId);//base attributes on an existing feature
    
        //change attributes for the new feature
        modifyInspector["SHAPE"] = polygon;//Update the geometry
        modifyInspector["NAME"] = "Updated name";//Update attribute(s)
    
        modifyFeature.Modify(modifyInspector);
    
        //update geometry and attributes using overload
        var featureAttributes = new Dictionary<string, object>
        {
          ["NAME"] = "Updated name"//Update attribute(s)
        };
        modifyFeature.Modify(featureLayer, objectId, polygon, featureAttributes);
    
        //Execute to execute the operation
        //Must be called within QueuedTask.Run
        if (!modifyFeature.IsEmpty)
        {
          //Execute and ExecuteAsync will return true if the operation was successful and false if not
          var result = modifyFeature.Execute();
          //or use async flavor
          //await modifyFeatures.ExecuteAsync();
        }
      });
    Move feature to a specific coordinate
    // Moves the first selected feature in the specified feature layer to the given coordinates.
    await QueuedTask.Run<bool>(() =>
     {
       //Get all of the selected ObjectIDs from the layer.
       var mySelection = featureLayer.GetSelection();
       var selOid = mySelection.GetObjectIDs()?[0];
       var xCoordinate = 0.0;
       var yCoordinate = 0.0; // specify the target coordinates to move the geometry
       var moveToPoint = new MapPointBuilderEx(xCoordinate, yCoordinate, 0.0, 0.0, featureLayer.GetSpatialReference());
    
       var moveEditOperation = new EditOperation() { Name = "Move features" };
       moveEditOperation.Modify(featureLayer, selOid ?? -1, moveToPoint.ToGeometry());  //Modify the feature to the new geometry 
       if (!moveEditOperation.IsEmpty)
       {
         var result = moveEditOperation.Execute(); //Execute and ExecuteAsync will return true if the operation was successful and false if not
         return result; // return the operation result: true if successful, false if not
       }
       return false; // return false to indicate that the operation was not empty
     });
    Order edits sequentially
    // Modifies the "NAME" attribute of a specified feature and then splits the feature using the provided polyline, all within a single sequential edit operation.
    // perform an edit and then a split as one operation.
    await QueuedTask.Run(() =>
     {
       var newName = "Modified then Split";
       var queryFilter = new QueryFilter() { WhereClause = "OBJECTID = " + objectId.ToString() };
    
       // create an edit operation and name.
       var op = new EditOperation
       {
         Name = "modify followed by split",         // set the ExecuteMode
         ExecuteMode = ExecuteModeType.Sequential
       };
       using (var rowCursor = layer.Search(queryFilter))
       {
         while (rowCursor.MoveNext())
         {
           using var feature = rowCursor.Current as ArcGIS.Core.Data.Feature;
           op.Modify(feature, "NAME", newName);
         }
       }
       op.Split(layer, objectId, splitLine);
       if (!op.IsEmpty)
       {
         bool result = op.Execute();
       }
       // else
       //  The operation doesn't make any changes to the database so if executed it will fail
     });
    Modify a record within Row Events - using EditOperation.Modify
    // Subscribe to the <see cref="ArcGIS.Desktop.Editing.Events.RowChangedEvent"/> for
    // the first  <see cref="ArcGIS.Desktop.Mapping.FeatureLayer"/> in the active map. The event handler can be used to
    // respond to changes in rows within the table, such as modifications or updates.
    Table changeTable = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault().GetTable();
    RowChangedEvent.Subscribe(rowChangedEventArgs =>
      {
        // set the last row changed guid when you execute the Row.Store method
        // used for re-entry checking
        Guid _lastEdit = new();
    
        // RowEvent callbacks are always called on the QueuedTask so there is no need 
        // to wrap your code within a QueuedTask.Run lambda.
    
        //example of modifying a field on a row that has been created
        var parentEditOp = rowChangedEventArgs.Operation;
    
        // avoid recursion
        if (_lastEdit != rowChangedEventArgs.Guid)
        {
          //update field on change
          parentEditOp.Modify(rowChangedEventArgs.Row, "ZONING", "New");
    
          _lastEdit = rowChangedEventArgs.Guid;
        }
      }, changeTable);
    Read and Write blob fields with the attribute inspector
    await QueuedTask.Run(() =>
    {
      // get selected feature into inspector
      var selectedFeatures = activeMap.GetSelection();
      var insp = new Inspector();
      insp.Load(selectedFeatures.ToDictionary().Keys.First(), selectedFeatures.ToDictionary().Values.First());
      // read a blob field and save to a file
      var msw = new MemoryStream();
      msw = insp["BlobField"] as MemoryStream;
      using (FileStream file = new(@"d:\temp\blob.jpg", FileMode.Create, FileAccess.Write))
      {
        msw.WriteTo(file);
      }
      // read file into memory stream
      var msr = new MemoryStream();
      using (FileStream file = new(@"d:\images\Hydrant.jpg", FileMode.Open, FileAccess.Read))
      {
        file.CopyTo(msr);
      }
      //put the memory stream in the blob field and save to feature
      var op = new EditOperation() { Name = "Blob Inspector" };
      insp["Blobfield"] = msr;
      op.Modify(insp);
      if (!op.IsEmpty)
      {
        var result = op.Execute(); //Execute and ExecuteAsync will return true if the operation was successful and false if not
      }
    });
    Write a compressed image to a raster field
    await QueuedTask.Run(() =>
    {
      //Open the raster dataset on disk and create a compressed raster value dataset object
      var dataStore = new ArcGIS.Core.Data.FileSystemDatastore(new ArcGIS.Core.Data.FileSystemConnectionPath(new Uri(@"e:\temp"), ArcGIS.Core.Data.FileSystemDatastoreType.Raster));
      using (var fileRasterDataset = dataStore.OpenDataset<ArcGIS.Core.Data.Raster.RasterDataset>("Hydrant.jpg"))
      {
        var storageDef = new ArcGIS.Core.Data.Raster.RasterStorageDef();
        storageDef.SetCompressionType(ArcGIS.Core.Data.Raster.RasterCompressionType.JPEG);
        storageDef.SetCompressionQuality(90);
    
        var rv = new ArcGIS.Core.Data.Raster.RasterValue();
        rv.SetRasterDataset(fileRasterDataset);
        rv.SetRasterStorageDef(storageDef);
    
        var sel = MapView.Active.Map.GetSelection();
    
        //insert a raster value object into the raster field
        var insp = new ArcGIS.Desktop.Editing.Attributes.Inspector();
        insp.Load(sel.ToDictionary().Keys.First(), sel.ToDictionary().Values.First());
        insp["Photo"] = rv;
    
        var op = new EditOperation() { Name = "Raster Inspector" };
        op.Modify(insp);
        if (!op.IsEmpty)
        {
          var result = op.Execute(); //Execute and ExecuteAsync will return true if the operation was successful and false if not
        }
      }
    });
    Update Annotation Text via attribute.
    {
      var oid = 1;
    
      // See "Change Annotation Text Graphic" for an alternative if TEXTSTRING is missing from the schema
    
      // Note: QueuedTask is required to access the Inspector
      {
        // use the inspector methodology
        var insp = new Inspector();
        insp.Load(annotationLayer, oid);
    
        // make sure TextString attribute exists.
        //It is not guaranteed to be in the schema
        ArcGIS.Desktop.Editing.Attributes.Attribute att = insp.FirstOrDefault(a => a.FieldName == "TEXTSTRING");
        if (att != null)
        {
          insp["TEXTSTRING"] = "Hello World";
    
          //create and execute the edit operation
          EditOperation op = new EditOperation();
          op.Name = "Update annotation";
          op.Modify(insp);
    
          //OR using a Dictionary - again TEXTSTRING has to exist in the schema
          //Dictionary<string, object> newAtts = new Dictionary<string, object>();
          //newAtts.Add("TEXTSTRING", "hello world");
          //op.Modify(annotationLayer, oid, newAtts);
    
          op.Execute();
        }
      }
    }
    Edit the attributes of a FeatureSceneLayer
    {
      //must support editing!
      if (!featSceneLayer.HasAssociatedFeatureService ||
          !featSceneLayer.IsEditable)
        return;
    
      // Note: call within QueuedTask.Run()
      {
        var editOp = new EditOperation()
        {
          Name = "Edit FeatureSceneLayer Attributes",
          SelectModifiedFeatures = true
        };
        //make an inspector
        var inspector = new Inspector();
        //get the attributes for the specified oid
        inspector.Load(featSceneLayer, oid);
        inspector["PermitNotes"] = "test";//modify
        editOp.Modify(inspector);
        editOp.Execute();//synchronous flavor
      }
    }
    Requirements

    Target Platforms: Windows 11 Home, Pro, Enterprise (64 bit)

    ArcGIS Pro version: 3.0 or higher.
    See Also