ThinkGeo.com    |     Documentation    |     Premium Support

Removing marker from SimpleMarkerOverlay throws key not found exception

Guys, under what conditions should calling  :


SimpleMarkerOverlay.Markers.Remove(Marker) 


throw the following exception:


 


System.Collections.Generic.KeyNotFoundException was unhandled by user code


  Message="The given key was not present in the dictionary."


  Source="mscorlib"


  StackTrace:


       at System.ThrowHelper.ThrowKeyNotFoundException()


       at System.Collections.Generic.Dictionary`2.get_Item(TKey key)


       at ThinkGeo.MapSuite.Core.GeoCollection`1.RemoveItem(Int32 index)


       at System.Collections.ObjectModel.Collection`1.Remove(T item)


 


By looking at object hashcode, it is the same marker instance I added earlier.  It is also the same overlay instance I added the marker to earlier.   


TIA.



Oh, I see the problem.  I need to call SimpleMarkerOverlay.Markers.Add(string, Marker) otherwise, you guys generate a random GUID!  With the randon GUID, calling Markers.Remove(marker) will fail because you are again generating another random GUID :)  Common guys… 
  
 I recall stumbling into this problem a while  back and suggested you guys create a GUID based on object hashcode or something.  Why a random GUID?  What purpose does it serve if has no relationship to the object itself?

 Klaus,


 
Thanks for your suggestions!
 
I tested the remove ability for SimpleMarkerOverlay, but I didn't encounter the problem what you encountered, here is my test code below:
 



        Marker marker = new Marker();
        private void Form_Load(object sender, EventArgs e)
        {
            winformsMap1.MapClick += new EventHandler<MapClickWinformsMapEventArgs>(winformsMap1_MapClick);
            winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
            winformsMap1.CurrentExtent = new RectangleShape(-155.733, 95.60, 104.42, -81.9);

            SimpleMarkerOverlay markerOverlay = new SimpleMarkerOverlay();
            markerOverlay.MapControl = winformsMap1;
            winformsMap1.Overlays.Add("MarkerOverlay", markerOverlay);

            winformsMap1.Refresh();
        }

        private void winformsMap1_MapClick(object sender, MapClickWinformsMapEventArgs e)
        {
            SimpleMarkerOverlay markerOverlay = (SimpleMarkerOverlay)winformsMap1.Overlays["MarkerOverlay"];

            marker = new Marker(e.WorldLocation);
            marker.Image = Properties.Resources.AQUA;
            marker.Width = 20;
            marker.Height = 34;
            marker.YOffset = -17;

            markerOverlay.Markers.Add(marker);

            winformsMap1.Refresh();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SimpleMarkerOverlay markerOverlay = (SimpleMarkerOverlay)winformsMap1.Overlays["MarkerOverlay"];
            markerOverlay.Markers.Remove(marker);

            winformsMap1.Refresh();
        }
  The logic of the code snippet above is that you can click on the map to add a marker and click the button to remove the added marker. There are no exceptions occurred. I would like to ask you what the version number you used or are there anything wrong in your sample code?


Thanks,


Scott,