ThinkGeo.com    |     Documentation    |     Premium Support

Detect which feature fired the TrackShapeFinished event

 Hi,


as you can see on the screenshot I joined, I'm editing some features on the edit layer, when the modification of a feature ends I would like to display a balloon on this edited feature (server side because I need some datas from the server) so I added an event on my map:


OnTrackShapeFinished="Map1_TrackShapeFinished"


And in my CS:



protected void Map1_TrackShapeFinished(object sender, EventArgs e)


which is called each time I finish to draw or edit a shape so all is good, I only would like to know how to retrieve the last edited shape in this method so I can open my balloon with datas on it ?


Thank you very much for your help.


 




Hi Gauiter,


For your reference, the following code should meet your requirement.


--Client side


var oParser;
var note = 'LastEditFeature';

var OnMapCreated = function (map) {
    oParser = Map1.GetMapParser();
}

var Map1ClientEditEnd = function (feature) {
    for (var i = 0; i < oParser.editOverlay.features.length; i++) {
        var featureId = oParser.editOverlay.features[i].fid;
        if (featureId.indexOf(note) != -1) {
            featureId = featureId.substring(0, oParser.editOverlay.features[i].fid.length - note.length);
        }
    }
    feature.fid = feature.fid + note;
}


--Server side


protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        // other logic
        Map1.OnClientEditEnd = "Map1ClientEditEnd";
    }
}

protected void Map1_TrackShapeFinished(object sender, EventArgs e)
{
    if (Map1.EditOverlay.Features.Count > 0)
    {
        foreach (Feature feature in Map1.EditOverlay.Features)
        {
            if (feature.Id.IndexOf("LastEditFeature") != -1)
            {
                // other logic
                break;
            }
        }
    }
}


By the way, you can check the link below to get more information about “Create&Edit Shape”. gis.thinkgeo.com/Support/Dis...fault.aspx


Regards,


Ivan



Thank you Ivan, I was following this thread but I didn’t get the way it worked (add a custom string to the feature on the client side and detect it after on server side). 
  
 Thanks to your new sample I think I understand better and I’m going to try this right now ! 
  
 Thank you.

Gautier, 



You're welcome. I will keep an eye on your feedback, hope everything goes well. 



Regards, 



Ivan



 So everything is in place and should work but there is a problem with my application because I have 2 event listeners on the map: "TrackShapeFinished" and "click" so when I edit a feature, then I click outside so the "TrackShapeFinished" is called but just after the "click" is called and it cancels my "TrackShapeFinished" call.


I join a screenshot so you can see what it does:



 


What do you think I should do ?


Thank you.



Gautier,


I think you need to judge whether the click event is fired after editing a feature or not, as the code below:


--Server side


private const string note = "LastEditFeature";

protected void Map1_TrackShapeFinished(object sender, EventArgs e)
{
    HandleLastEditFeature();
}


protected void Map1_Click(object sender, MapClickedEventArgs e)
{
    HandleLastEditFeature();
}

private void HandleLastEditFeature()
{
    for (int i = 0; i < Map1.EditOverlay.Features.Count; i++)
    {
        Feature feature = Map1.EditOverlay.Features[i];
        if (feature.Id.IndexOf(note) != -1)
        {
            // other logic
            // remove the note from last edit feature
            Map1.EditOverlay.Features.RemoveAt(i);
            BaseShape shape = feature.GetShape();
            shape.Id = shape.Id.Substring(0, shape.Id.Length - note.Length);
            Feature newFeature = new Feature(shape, feature.ColumnValues);
            Map1.EditOverlay.Features.Insert(i, newFeature);
            break;
        }
    }
}


--Client side


var note = 'LastEditFeature';

var Map1ClientEditEnd = function (feature) {
    feature.fid = feature.fid + note;
}


Please let me know if you have further questions.


Regards,


Ivan



OK thanks, simple but really smart ! 
 Works like a charm for me. 
  
 There is still the aborted call to "TrackShapeFinished" but it does not disturb here… 
  
 Just to make it clean is there a way to disable the MapClick listener while in edit mode and enable it again when edit ends ? 
  


Gautier,


You can achieve this function by removing the Click event on server side while in edit mode. I did some test and it worked, the code snippet below is for your reference:



Map1.EditOverlay.TrackMode = TrackMode.Edit;


Map1.Click -= new EventHandler<MapClickedEventArgs>(Map1_Click);



Regards,


Ivan



 OK thanks so for the Map_Click handler I had:


 protected void Map1_Click(object sender, MapClickedEventArgs e)


Which I changed to:


 protected void Map1_Click(object sender, EventArgs e)
{
    MapClickedEventArgs eventArg = (MapClickedEventArgs)e;


Now on this line of code:
Map1.Click -= new EventHandler(Map1_Click);
I have the following error:


Impossible de convertir implicitement le type 'System.EventHandler' en 'System.EventHandler
<thinkgeo.mapsuite.webedition.mapclickedeventargs>


Where am I wrong ?


Thanks for your help.


 



Sorry my error message was truncated: 




Impossible de convertir implicitement le type 'System.EventHandler' en 'System.EventHandler<ThinkGeo.MapSuite.WebEdition.MapClickedEventArgs>'



Gautier,


The code snippet is for your reference so you should pay attention to the EventHandler, please use the following code snippet to have another try.


Map1.Click -= new EventHandler<MapClickedEventArgs>(Map1_Click);


or 


Map1.Click -= Map1_Click;


Regards,


Ivan



OK great thank you very much, I didn’t know that one could simply put: 
  
 Map1.Click -= Map1_Click; 
  
 It works great ! so thanks again for your precious support. 


Gautier, 
  
 You’re welcome. Have a good day. 
  
 Regards, 
  
 Ivan