ArcGIS Pro 3.7 API Reference Guide
ArcGIS.Desktop.Editing Namespace / EditOperation Class / Modify Method / Modify(Inspector) Method
An inspector that specifies the features or rows and their attributes.
Example

In This Topic
    Modify(Inspector) Method
    In This Topic
    Modify a feature or row defined by an inspector object.
    Syntax
    Public Overloads Sub Modify( _
       ByVal inspector As Inspector _
    ) 
    public void Modify( 
       Inspector inspector
    )

    Parameters

    inspector
    An inspector that specifies the features or rows and their attributes.
    Exceptions
    ExceptionDescription
    Angle can only be set for Point geometries or Two-point polyline geometries.
    Remarks
    This method is used to update the geometry and/or attribute values of features.
    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();
        }
      });
    Edit Operation Modify multiple features
    // Modifies multiple features in the specified feature layer by updating their attributes.
    await QueuedTask.Run(() =>
      {
        //Search by attribute
        var queryFilter = new QueryFilter() { WhereClause = "OBJECTID < 1000000" };
        //Create list of oids to update
        var oidSet = new List<long>();
        using (var rc = featureLayer.Search(queryFilter))
        {
          while (rc.MoveNext())
          {
            using var record = rc.Current;
            oidSet.Add(record.GetObjectID());
          }
        }
        //create and execute the edit operation
        var modifyFeatures = new EditOperation
        {
          Name = "Modify features",
          ShowProgressor = true
        };
    
        var multipleFeaturesInsp = new Inspector();
        multipleFeaturesInsp.Load(featureLayer, oidSet);
        multipleFeaturesInsp["MOMC"] = 24;
        modifyFeatures.Modify(multipleFeaturesInsp);
        if (!modifyFeatures.IsEmpty)
        {
          var result = modifyFeatures.ExecuteAsync(); //Execute and ExecuteAsync will return true if the operation was successful and false if not
        }
      });
    Update Annotation Text
    // Updates the text of an annotation feature in the specified annotation layer.
    await QueuedTask.Run(() =>
    {
      // annotationLayer is ~your~ Annotation layer...
      // use the inspector methodology
      var insp = new Inspector();
      insp.Load(annotationLayer, objectId);
      // get the annotation properties
      AnnotationProperties annoProperties = insp.GetAnnotationProperties();
      // set the attribute
      annoProperties.TextString = annotationText;
      // assign the annotation properties back to the inspector
      insp.SetAnnotationProperties(annoProperties);
      //create and execute the edit operation
      EditOperation op = new EditOperation();
      op.Name = "Update annotation";
      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
      }
    });
    Modify Annotation Shape
    // Modifies the geometry of an annotation feature in the specified annotation layer.
    await QueuedTask.Run(() =>
    {
      //Don't use 'Shape'....Shape is the bounding box of the annotation text. This is NOT what you want...
      //
      //var insp = new Inspector();
      //insp.Load(annotationLayer, objectId);
      //var shape = insp["SHAPE"] as Polygon;
      //...wrong shape...
      //Instead, we must use the AnnotationProperties
      //annotationLayer is ~your~ Annotation layer
      var insp = new Inspector();
      insp.Load(annotationLayer, objectId);
      AnnotationProperties annoProperties = insp.GetAnnotationProperties();
      var shape = annoProperties.Shape;
      if (shape.GeometryType != GeometryType.GeometryBag)
      {
        var newGeometry = GeometryEngine.Instance.Move(shape, 10, 10);
        annoProperties.Shape = newGeometry;
        insp.SetAnnotationProperties(annoProperties);
        EditOperation op = new EditOperation
        {
          Name = "Change annotation angle"
        };
        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
        }
      }
    });
    Modify Annotation Text Graphic
    // Modifies the text graphic of a selected annotation feature in the specified annotation layer.
    await QueuedTask.Run(() =>
    {
      var selection = annotationLayer.GetSelection();
      if (selection.GetCount() == 0)
        return;
      // use the first selected feature 
      var insp = new Inspector();
      insp.Load(annotationLayer, selection.GetObjectIDs().FirstOrDefault());
      // getAnnoProperties should return null if not an annotation feature
      AnnotationProperties annoProperties = insp.GetAnnotationProperties();
      // get the textGraphic
      CIMTextGraphic textGraphic = annoProperties.TextGraphic;
      // change text
      textGraphic.Text = "Hello world";
      // set x,y offset via the symbol
      var symbol = textGraphic.Symbol.Symbol;
      var textSymbol = symbol as CIMTextSymbol;
      textSymbol.OffsetX = 2;
      textSymbol.OffsetY = 3;
      textSymbol.HorizontalAlignment = HorizontalAlignment.Center;
      // load the updated textGraphic
      annoProperties.LoadFromTextGraphic(textGraphic);
      // assign the annotation properties back 
      insp.SetAnnotationProperties(annoProperties);
      EditOperation op = new EditOperation
      {
        Name = "modify symbol"
      };
      op.Modify(insp);
      if (!op.IsEmpty)
      {
        bool result = op.Execute(); //Execute and ExecuteAsync will return true if the operation was successful and false if not
      }
    });
    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
     });
    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