ThinkGeo.com    |     Documentation    |     Premium Support

Clearing EditOverlay causes Key Not Present Exception

When I clear all layers in the EditOverlay and add another shape to it. I get a "The given key was not present in the dictionary" exception.


I have attached a test solution (update of CustomTrackPolygon to show error).


To replicate:


1. Add a polygon (click, click, click, double click)


2. Click Edit button


3. Add another polygon


When track ended is fired for the second polygon an exception is thrown when I try and refresh the EditOverlay.


This is Desktop v5.0


Cheers


Steve



CustomTrackPolygon.zip (41.6 KB)

Hello Steve, 
  
 Thanks for your post and sample, I have recreate this problem, we are working on this find the root cause and fix it, please subscribe this post and I will let you know the result asap. 
  
 Regards, 
  
 Gary

Thanks Gary. 
  
 Just tried this with v5.5 and get the same exception. 
  
 Will wait for your response. 
  
 Cheers 
  
 Steve

If I comment this line out 
  
 winformsMap1.EditOverlay.ExistingControlPointsLayer.InternalFeatures.Clear(); 
  
 Then I no longer get an exception ( I do however get the control points left on the screen). Might point at the problem? 
  
 Cheers 
  
 Steve

Just tried with latest daily build (5.5.108) and get the same exception. 
  
 Cheers 
  
 Steve

Hello Steve, 
  
 I will post result here as soon as we resloved this. 
  
 Regards, 
  
 Gary

Hi Gary 
  
 Any update on this? I have a customer waiting for a bug fix from us and I need to give them an ETA. 
  
 Cheers 
  
 Steve 


Hello Steve,


Sorry for waiting, this problem connect to some other question, so it cost a lot time.


when I invoked CalculateAllControlPoints function, I found that the internal features’ RTree had been rebuilt. However, after I did some operation to these features I didn’t recall “BuildIndex” method. And these new features are not included in RTree dictionary. It will throw the exception when I got features by RTree index.


We have two solution for this issue:

1.       The CalculateAllControlPoints should be invoked after the internal features have been changed, because the BuildIndex would be invoked, the RTree index would be reconstructed. The codes snipped as follows:




winformsMap1.EditOverlay.EditShapesLayer.InternalFeatures.Clear();
 
            // need this to clear edit drag/resize controls
            winformsMap1.EditOverlay.ExistingControlPointsLayer.InternalFeatures.Clear();
            winformsMap1.EditOverlay.ResizeControlPointsLayer.InternalFeatures.Clear();
            winformsMap1.EditOverlay.RotateControlPointsLayer.InternalFeatures.Clear();
            winformsMap1.EditOverlay.DragControlPointsLayer.InternalFeatures.Clear();
 
            winformsMap1.EditOverlay.CalculateAllControlPoints();
 
            winformsMap1.Refresh(new Overlay[] { winformsMap1.EditOverlay });
2.       we can solve the issue with BeginTransaction and CommitTransaction. The codes snipped as follows:


winformsMap1.EditOverlay.DragControlPointsLayer.Open();
            winformsMap1.EditOverlay.DragControlPointsLayer.FeatureSource.BeginTransaction();
            winformsMap1.EditOverlay.DragControlPointsLayer.InternalFeatures.Clear();
            winformsMap1.EditOverlay.DragControlPointsLayer.FeatureSource.CommitTransaction();
            winformsMap1.EditOverlay.DragControlPointsLayer.Close();


Please let us know if you still can't let it work.


Regards,


Gary



Thanks Gary


After you pointed me in the correct direction I have managed to make an even easier method that works:


 



    private void ClearEditOverlay()
    {
        gisMap.EditOverlay.EditShapesLayer.InternalFeatures.Clear();
        gisMap.EditOverlay.CalculateAllControlPoints(); 
        gisMap.Refresh(new Overlay[] { gisMap.EditOverlay });
    }


Cheers

Steve

Hello Steve, 
  
 You are welcome and thanks for sharing your experience. 
  
 Regards, 
  
 Gary