ThinkGeo.com    |     Documentation    |     Premium Support

Contextmenu for marker question

Hello,


I need to show some specific information when a user click on a contextmenu item like :


ContextMenuItem showOnEventClick = new ContextMenuItem("[#SIEBEL_ACCOUNT_ID#]");

showOnEventClick.Click += new EventHandler<contextmenuitemclickeventargs>(ContactList_Click);

menuOnMarker.MenuItems.Add(showOnEventClick);</contextmenuitemclickeventargs>


 


I was expecting to get the data based on [#SIEBEL_ACCOUNT_ID#]  when the event:


 private void ContactList_Click(object sender, ContextMenuItemClickEventArgs e)


has been fired... but it seems than the innerhtml that is available inside the event is :  [#SIEBEL_ACCOUNT_ID#]  and not the data linked with the column.......


 


How can I get the data and not the column name from within the event handler?


 


thanks a lot.


 


jm.



Hi Jean-Marie,


The issue is that you need to be able to 'get' to the feature and define the feature you need to retrieve the column data for. To transfer the feature's Id that you are attempting to retrieve column data for you need to pass the feature's Id via the Innerhtml of the ContextMenuItem and then in the EventHandler you will be able parse the feature's id from the sender. With the Feature's Id you can then access the column data you desire.



Please see the following code based on the Map Suite Web Edition - Markers - Marker with Context Menu sample application:



using System;
using System.Web.UI;
using ThinkGeo.MapSuite.Core;
using ThinkGeo.MapSuite.WebEdition;
using System.Collections.Generic;

namespace CSSamples.Samples.Markers
{
    public partial class MarkerWithContextMenu : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF"));
                Map1.CurrentExtent = new RectangleShape(-131.22, 55.05, -54.03, 16.91);
                Map1.MapUnit = GeographyUnit.DecimalDegree;

                WorldMapKitWmsWebOverlay worldMapKitOverlay = new WorldMapKitWmsWebOverlay();
                Map1.CustomOverlays.Add(worldMapKitOverlay);

                ContextMenu menuOnMarker = new ContextMenu("kansas", 180);
                ContextMenuItem redirectItem = new ContextMenuItem("<a href='en.wikipedia.org/wiki/Lawrence%2C_Kansas' target='_blank'>Knasas city<a>");

                //Choice within context menu that is wired to click event
                ContextMenuItem showPositionItem = new ContextMenuItem("");
                ContextMenuItem zoomOutItem = new ContextMenuItem("<div onclick='Map1.ZoomIn();'>Zoom in");
                ContextMenuItem zoomInItem = new ContextMenuItem("<div onclick='Map1.ZoomOut();'>Zoom out");
                ContextMenuItem centerItem = new ContextMenuItem("<div onclick='Map1.PanToWorldCoordinate(-94.558, 39.078);'>Center map here");
                ContextMenuItem test = new ContextMenuItem("[#NAME#]");
                ContextMenuItem test1 = new ContextMenuItem("[#NAME#]");
                showPositionItem.Click += new EventHandler<ContextMenuItemClickEventArgs>(showPosition_Click);
                
                menuOnMarker.MenuItems.Add(redirectItem);
                menuOnMarker.MenuItems.Add(showPositionItem);
                menuOnMarker.MenuItems.Add(zoomOutItem);
                menuOnMarker.MenuItems.Add(zoomInItem);
                menuOnMarker.MenuItems.Add(centerItem);
                menuOnMarker.MenuItems.Add(test);
                menuOnMarker.MenuItems.Add(test1);

                
                InMemoryMarkerOverlay markerOverlay = new InMemoryMarkerOverlay("MarkerOverlay");
                markerOverlay.Name = "markerOverlay";
                
                FeatureSourceColumn nameColumn = new FeatureSourceColumn("NAME");
                markerOverlay.Columns.Add(nameColumn);

                BaseShape kansasShape = new PointShape(-94.558, 39.078);
                Feature testFeature = new Feature(kansasShape.GetWellKnownText());
                //Defining the InnerHtml that contains the ID of the feature
                showPositionItem.InnerHtml = "CurrentPosition(Server Event)";
                testFeature.ColumnValues.Add("NAME", "Kansas is my name");

                markerOverlay.Features.Add("kansasCity", testFeature);
                
                markerOverlay.ZoomLevelSet.ZoomLevel01.DefaultMarkerStyle.ContextMenu = menuOnMarker;
                markerOverlay.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
                Map1.CustomOverlays.Add(markerOverlay);
            }
        }

        private void showPosition_Click(object sender, ContextMenuItemClickEventArgs e)
        {
           //On the MenuItem you have a Innerhtml that you can pase the FeatureId from
           //With the FeatureID you can get the feature and it column value data
           ContextMenuItem menuItem = (ContextMenuItem)sender;


            //Longitude.Value = e.Location.X.ToString();
           //Latitude.Value = e.Location.Y.ToString();
        }
    }
}
 

 


 


 



Hello Ryan! 
  
 I understand your sample but what if I have  an in memory marker overlay with more than one feature?  
  
 how can I format the showPositionItem inner html for each feature?  
  
 jm

Hi Jean-Marie,  
  
 I don’t think this is possible with the default implementation of Markers and a MarkerOverlay as you do not have the ability to setup separate ZoomLevels/Styles/ContextMenus for individual Markers.  
  
 One idea you might try would involve creating your own Marker and Marker Overlay class that would provide the ZoomLevel/Style functionality to each of the Markers in your MarkerOverlay. The code you would use to create these new classes would be sourced from our the MapShapeLayer Class code supplied here:  
 gis.thinkgeo.com/Support/DiscussionForums/tabid/143/aff/16/aft/4921/afv/topic/Default.aspx 
  
 As you can see these code provides a ZoomLevelSet, Styles and thus a seperate ContextMenu object for each MapShape. This idea is untested, and I will be following up with one of our lead developers on this to verify, but should get you moving in the right direction.