ThinkGeo.com    |     Documentation    |     Premium Support

Change Image on Marker Click

I am attempting to change the WebImage of a Marker added to our map's InMemoryMarkerOverlay in the MarkerOverlay_Click event.  In the Click event I have the following code:



protected void markerOverlay_Click(object sender, MarkerOverlayClickEventArgs e)
{
int times;
if (ViewState["ClickTimes" + e.FeatureId] != null)
{
times = (int)ViewState["ClickTimes" + e.FeatureId];
times++;
}
else
{
times = 1;
}
ViewState["ClickTimes" + e.FeatureId] = times;

InMemoryMarkerOverlay markerOverlay = (InMemoryMarkerOverlay)frMap.CustomOverlays["MarkerOverlay"];
if (times % 2 > 0)
{
markerOverlay.ZoomLevelSet.ZoomLevel01.DefaultMarkerStyle.WebImage.ImageVirtualPath = Page.ResolveUrl("~/MapSuiteData/theme/default/img/marker_blue.png");
}
else
{
markerOverlay.ZoomLevelSet.ZoomLevel01.DefaultMarkerStyle.WebImage.ImageVirtualPath = Page.ResolveUrl("~/MapSuiteData/theme/default/img/marker_yellow.png");
}    
}

I would like to be able to click on a marker and only it's WebImage gets updated, not all markers on the map, which is the current result.  The effect I am looking for is that this marker can have a "selected" and "deselected" look.  Any help would be appreciated.


Thanks! 



Jeremy, 
  
 I think the InMemoryMarkerOverlay is not suitable for your case. All the markers in InMemoryMarkerOverlay share the same theme like Image, text etc. There are two ways that we can manage: 
  
 1. Use InMemoryMarkerOverlay, but one marker shares one InMemoryMarkerOverlay. It can be works but not a good way. 
 2.  The best idea is use SimpleMarkerOverlay. It also has the same click event to InMemoryMarkerOverlay. 
  
 Thanks, 
  
 Johnny 


Thanks for your reply.


Unfortunately I cannot use the SimpleMarkerOverlay as it does not support FeatureSource, which I need for custom data and popups.  For your first suggestion, what are the performance implications of using many InMemoryMarkerOverlays?


Thanks!





Jeremy,


Another idea is that the ValueMarkerStyle can be used to identify the different images for markers.For instance, we can add a custom column "Sekected", and change the value of each feature coressponding to the markers when clicking on the marker,please try the code below:

 



 InMemoryMarkerOverlay markerOverlay = new InMemoryMarkerOverlay("MarkerOverlay");
markerOverlay.Click += new EventHandler<MarkerOverlayClickEventArgs>(markerOverlay_Click);
markerOverlay.Columns.Add(new FeatureSourceColumn("selected"));

ValueMarkerStyle valueStyle = new ValueMarkerStyle();
valueStyle.ColumnName = "selected";
MarkerValueItem selectedItem = new MarkerValueItem("1", "selected MarkerStyle");
MarkerValueItem unselectedItem = new MarkerValueItem("0", "unselected MarkerStyle");
valueStyle.ValueItems.Add(selectedItem);
valueStyle.ValueItems.Add(unselectedItem);

 void markerOverlay_Click(object sender, MarkerOverlayClickEventArgs e)
        {
            int times;
            if (ViewState["ClickTimes" + e.FeatureId] != null)
            {
                times = (int)ViewState["ClickTimes" + e.FeatureId];
                times++;
            }
            else
            {
                times = 1;
            }
            ViewState["ClickTimes" + e.FeatureId] = times;

            InMemoryMarkerOverlay markerOverlay = (InMemoryMarkerOverlay)frMap.CustomOverlays["MarkerOverlay"];
            Feature markerFeature = markerOverlay.FeatureSource.GetFeatureById(e.FeatureId, ReturningColumnsType.AllColumns);
            if (times % 2 > 0)
            {
                markerFeature.ColumnValues["selected"] = "1";
            }
            else
            {

                markerFeature.ColumnValues["selected"] = "0";
            }
        }


 


Thanks,


Johnny