ThinkGeo.com    |     Documentation    |     Premium Support

Deleteing a Feature

Im gettting a rather strange issue.


I'm busy testing my code for edit features from a shapefile. When I delete a feature, the feature itself is removed, however the corresponding row in the dbf file remains. I assume it gets marked as dirty, as when I open the dbf in excell it shows that the row is gone, yet if I open the shapefile in ArcView, it shows that the row still exists.


Unfortuantely this is now causing a null reference issue.


Below is an example of my code.


 


ShapeFileFeatureLayer currentLayer = (ShapeFileFeatureLayer)_Map.DynamicLayers.Layer["MyLayer"];



currentLayer.Open();

currentLayer.EditTools.BeginTransaction();


currentLayer.EditTools.Delete("11");


currentLayer.CommitTransaction(); 

currentLater.Close();



Jeremy,



The code above is correct. I have to confirm with you how do you open the shape file? Please make sure you are using ShapeFileReadWriteMode.ReadWrite. Here is the code:ShapeFileFeatureLayer layer = new ShapeFileFeatureLayer("[Shape File Path]", ShapeFileReadWriteMode.ReadWrite);


Also, you can test it with MapSuiteExplorer to see whether there is any exception thrown when open the shape file.



If you have any questions please let me know.



Thanks,

Howard

 



correct I’m using read write when opening the file. Its strange. I’m pretty sure the code worked before I downloaded the latest version of mapsuite, Though I may be wrong. 
  
 As I said, it is deleting the shape from the.shp file. Even arcview shows that the shape is gone. However the related row in the dbf file is still there. This however only shows in arcview and not in map suite. When I opn the dbf in Excell it is gone, but if I open it in a text editor it is still there. 
  
 I’ll try map suite explorer in the morning. 
  
 Thanks.

Ok, I’ve checked it in Map Suite Explorer and it works, on top of which is shows that the row is no longer there. Yet ArcView still shows it. As I said above, it seems to be marking the row as dirty. 
  
 The problem comes in with the fact that when I go to push my layer to the edit layer.  
  
 I get a collection of the features with their data, then I push this to the edit layer after setting up the edit layers columns. but the probelem comes in immediately here: 
  
 Collection<Feature> EditFeatures = currentLayer.FeatureSource.GetAllFeatures(ReturningColumnsType.AllColumns); 
  
 In this this collection, my deleted feature still exists.

Jeremy, 



I see what you mean. The code above is quick deleting and you are right it's kind of marking the feature dirty.



After the committing the transaction, please rebuild the shape file again. Here is the code.ShapeFileFeatureLayer.Rebuild("[Shape File Path]");


Hope it helps.



Thanks,

Howard



Brilliant. Works perfectly now! I would ask just one more thing before marking this as answered. 
  
 How the system works is a user clicks an edit button. this then pushes the "Current" layer onto the edit overlay. They then select delete, and click on the shapes they want deleted, which goes into a feature collection. at the same time the system removes that shape from the edit layer. and afterward they click save changes which then actually applies the changes to the "Current" layer. 
  
 My question is why on click when the system removes the shape from the edit overlay, is the overlay not refreshing on post back? is there a refresh option to force the edit overlay to redraw?

Jeremy, 
  
 I’m not sure how do you implement click to remove the clicked feature on your side. If you implement map.Click event, it sure refreshes by PostBack. If you implement this using JavaScript, I think the shape you clicked is gone; in this case why do you want the overlay to refresh? 
  
 Looking forward your more information. 
  
 Any questions please let me know. 
  
 Thanks, 
 Howard

This is a portion my code in the Map.Click() event relating to the deletion of the shape. Please note that DeleteFeatures and EditFeatures are of type Collection feature > that I have declared elsewhere.


_Map.EditOverlay.FeatureSource.Open();                     {                         Collection<feature> selectedFeatures = _Map.EditOverlay.QueryTools.GetFeaturesIntersecting(e.Position, ReturningColumnsType.NoColumns);                         if (selectedFeatures.Count > 0)                         {                             foreach (Feature selectedFeature in selectedFeatures)                             {                                                                 DeleteFeatures.Add(selectedFeature);                                 _Map.EditOverlay.FeatureSource.Open();                                 EditFeatures.Remove(selectedFeature);                                 _Map.EditOverlay.Features.Remove(selectedFeature);                                                                     _Map.EditOverlay.FeatureSource.Close();                             }                         }                     }                                          _Map.EditOverlay.FeatureSource.Close();                      _Map.StaticOverlay.Redraw();                     _Map.DynamicOverlay.Redraw();


The idea is just to remove the feature from the edit layer for now, and to store it in the DeletedFeatures collection. Then layer when the use clicks save changes, the actuall layer represented by the edit layer will then gets the features listed in the DeleteFeatures collection removed.  This all workes perfectly now except for the code mentioned here, where on click the edit layer isnt refreshing the fact that it has had clicked on feature removed.



Jeremy, 



I did a test in our installed sample "DrawEditShapes.aspx"; it works fine. Please replace our installed sample with the attached code to see how it works.



Thanks,

Howard



1045-DrawEditShapes.zip (3.59 KB)