ThinkGeo.com    |     Documentation    |     Premium Support

Error when deleting last feature in shapefile

Hi guys,


This is not a horrible problem but it appears to be  a bug in the ThinkGeo codebase. I have a attached a sample project that demonstrates the problem. Basically, you can delete features from shapefiles with no problem until you try to delete the last one and then an exception is thrown:



System.NullReferenceException was unhandled
  Message=Object reference not set to an instance of an object.
  Source=MapSuiteCore
  StackTrace:
       at ThinkGeo.MapSuite.Core.ShapeFileFeatureSource.CommitTransactionCore(TransactionBuffer transactions)
       at ThinkGeo.MapSuite.Core.FeatureSource.CommitTransaction()
       at ThinkGeo.MapSuite.Core.EditTools.CommitTransaction()
       at DeleteTest.Form1.WinformsMap1_KeyUp(Object sender, KeyEventArgs e) in C:\Users\steller\Documents\Visual Studio 2010\Projects\ThinkGeo\Delete Feature From Shapefile Test\Form1.vb:line 68
       at System.Windows.Forms.KeyEventHandler.Invoke(Object sender, KeyEventArgs e)
       at System.Windows.Forms.Control.OnKeyUp(KeyEventArgs e)
       at System.Windows.Forms.Control.ProcessKeyEventArgs(Message& m)
       at System.Windows.Forms.Control.ProcessKeyMessage(Message& m)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
       at DeleteTest.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 


Thanks!


Steve


 


 



Delete_Feature_From_Shapefile_Test.zip (23.2 KB)

Steven,


 I did some modification in the functions WinformsMap1_KeyUp and WinformsMap1_MapClick and I did not encountered the problem that you describe. I think that you were not opening and closing properly the shapefile. See your code with my modifications below:


 



  Private Sub WinformsMap1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles WinformsMap1.KeyUp
      Dim oSelectionLayer As InMemoryFeatureLayer = WinformsMap1.EditOverlay.EditShapesLayer

      If oSelectionLayer.InternalFeatures.Count > 0 Then
         If Not moShapefile.IsOpen Then
            moShapefile.Close()
            End If

            moShapefile.Open() 'VAL
         moShapefile.EditTools.BeginTransaction()
         For Each oFeature As Feature In oSelectionLayer.InternalFeatures
            moShapefile.EditTools.Delete(oFeature.Id)
         Next oFeature
         moShapefile.EditTools.CommitTransaction()
         moShapefile.Close()
         ShapeFileFeatureLayer.BuildIndexFile(moShapefile.ShapePathFileName)
         oSelectionLayer.InternalFeatures.Clear()
         WinformsMap1.Refresh()
      End If

   End Sub


   Private Sub WinformsMap1_MapClick(ByVal sender As Object, ByVal e As ThinkGeo.MapSuite.DesktopEdition.MapClickWinformsMapEventArgs) Handles WinformsMap1.MapClick
      Dim oFeatures As Collection(Of Feature)
      If e.MouseButton = MapMouseButton.Left Then

         If msKey <> String.Empty Then
            With WinformsMap1.EditOverlay.EditShapesLayer
               .Open()
               .EditTools.IsTransactionLive = True
               .EditTools.BeginTransaction()
               .EditTools.Delete(msKey)
               .EditTools.CommitTransaction()
            End With
         End If

            '***** Select a feature
            moShapefile.Open() 'VAL
            oFeatures = moShapefile.QueryTools.GetFeaturesContaining(New PointShape(e.WorldX, e.WorldY), ReturningColumnsType.AllColumns)
            moShapefile.Close() 'VAL

         If oFeatures.Count > 0 Then
            msKey = oFeatures(0).Id
            With WinformsMap1.EditOverlay.EditShapesLayer
               .Open()
               .EditTools.IsTransactionLive = True
               .EditTools.BeginTransaction()
               .EditTools.Add(oFeatures(0))
               .EditTools.CommitTransaction()
            End With
         End If

         WinformsMap1.Refresh()
      End If
   End Sub


Hi Val, 
  
 Thanks for the quick response. Also thank-you for helping me better understand that a shapefile must be opened and closed in a specific way for things to work correctly. 
  
 However, even with your code changes I still get the same exception. I should have mentioned that I am using a Development Daily build, just got the latest one today (5.5.28.0). With this build you will get the error, but I don’t get the error when using the production release 5.5.0.0. So most likely this is a bug that will be corrected in a future release. 
  
 Thanks, 
  
 Steve

Steven, 
  
    I did the test using the production release. You are right this bug will be most likely be corrected for the next public release in May. With the daily Development Build we don’t give the guaranty it is fully stable as new features are added without the strigent testing that production releases require. Thank you.

Val, 
  
 It’s working fine now. 
  
 Thanks! 
  
 Steve

Steven,


 I am glad we could provide a solution for you. If you have any other questions, let us know.  Thank you.



Hello again,


This bug is back. The problem went away and now is back. The last version I tested with was production build 5.5.0.60. You should be able to verify this with the sample I sent in my original post.


Thanks!


Steve


 


 


 


 



Steven,


  Thank you for reporting to us that the problem may be back. I communicated the issue to the Development team and they will look at this tomorrow. I will let you know what we found.



 Steven,


You are right. The bug is back from 5.5.0.48. We've just fixed it and please try the latest version. (5.5.0.62 or 5.5.62.0). 


Thanks,


Bai



Hi Ben, 
  
 I just downloaded and tested with production build 5.5.0.60 and I am still getting the bug. Any ideas? 
  
 Thanks! 
  
 Steve

Steven,


 


  You need to get the build 5.5.0.62 or higher to see the bug fix. 5.5.0.60 is an earlier version and the bug is still in it. I think this is the problem. Thank you.



Val, 
  
 My apologies, I didn’t look closely enough at the version number. Just got 5.5.0.66 and it works fine now. 
  
 Thank-you very much! 
  
 Steve

Steven,


 Not a problem. Good luck on your development!