2015-05-27 23 views
6

Sto usando il codice GMap.NET per mappe e marcatori. Aggiungere marcatori e fare qualsiasi cosa con la mappa non è stato il problema della rimozione di un singolo marker dalla mappa con cui ho problemi. Ho cercato ovunque su Google di rimuovere un indicatore dalla mappa ma rimuovere un marker non sembra essere un argomento scottante.Rimozione marcatore Gmap.net

Ecco lo snippet dal codice che uso per aggiungere.

 private void AddMarker_ButtonClick(object sender, AddMarkerEventArgs e) 
    { 
     DBDictAdd("Marker", " ",e.Latitude, e.Longitude, true, "192.168.1.1"); 
     m_dbMarkers.Insert(_table, dbmarkertable); 
     dbmarkertable.Clear(); 
     GMarkerGoogle marker = new GMarkerGoogle(new PointLatLng(e.Latitude, e.Longitude), 
       GMarkerGoogleType.green); 
     marker.ToolTip = new GMapRoundedToolTip(marker); 
     marker.ToolTipMode = MarkerTooltipMode.OnMouseOver; 
     marker.Tag = MarkerIndex; 
     marker.ToolTipText = (marker.Position.ToString()); 
     markersOverlay.Markers.Add(marker); 
     MarkerIndex++; 
    } 

Come potete vedere sto usando SQLite per memorizzare il ID e altre informazioni nel database per i marcatori. Sto usando l'approccio del database perché avrò bisogno di memorizzare più informazioni con la posizione del marcatore. Questa parte del codice funziona.

Il problema che sto avendo è chiamare le informazioni sul marker in modo da poterlo rimuovere. So che queste 2 chiamate esistono.

markersOverlay.Markers.Remove(); 
markersOverlay.Markers.RemoveAt(); 

ho usato il comando removeAt ma ho dovuto farlo manualmente e notato usando il comando removeAt(0) prende dal primo ingresso di tale matrice ogni volta.

Questo è quello che ho provato finora:

private void uxRemoveMarkerButton_Click(object sender, EventArgs e) 
     { 
      MessageBox.Show("Select the marker to remove."); 
      uxGmap.OnMarkerClick += new MarkerClick(uxGmap_OnMarkerClick); 

     } 

     private void uxGmap_OnMarkerClick(object sender, EventArgs e) 
     { 
      //int? mID = null; 
      //DataTable da = m_dbMarkers.GetDataTable("SELECT * from markers"); 
      //GMapMarker marker = null; 
      //PointLatLng p = new PointLatLng(lat, lng); 
      //foreach (GMapMarker m in markersOverlay.Markers) 
      //{ 
      // if (m.Position == p) 
      //  marker = m; 
      //} 
      //markersOverlay.Markers.Remove(marker); 
      //MessageBox.Show("done"); 
      //foreach (DataRow dr in da.Rows) 
      //{ 
      // if (Convert.ToDouble(dr[3]) == lat) 
      // { 
      //  MessageBox.Show(dr[3].ToString()); 
      //  //mID = Convert.ToInt32(dr[0]); 
      // } 
      //} 
      //markersOverlay.Markers.IndexOf(marker); 

      //mID= Convert.ToInt32(m_dbMarkers.ExecuteScalar("SELECT ID FROM markers")); 
      //m_dbMarkers.Delete(_table, String.Format("markers.ID = {0} ", mID)); 
      //markersOverlay.Markers.RemoveAt(mID); 
      //MessageBox.Show(mID.ToString()); 
      uxGmap.OnMarkerClick -= new MarkerClick(uxGmap_OnMarkerClick); 

     } 

Eventuali suggerimenti o linee guida su come posso ottenere l'ID pennarello o marcatore stesso quando clicco su di esso per rimuovere in realtà dalla mappa?

EDIT: ho aggiornato il AddMarker_ButtonClick

risposta

2

La soluzione che ho scoperto di rimuovere il marcatore dalla mappa:

GMap.Net ha un evento MarkerClick che è possibile sottoscrivere. Nella mia forma questo è il codice che ho usato e dove l'ho inserito nel codice del modulo.

Public Form1() 
    { 
      uxGmap.OnMarkerClick += new MarkerClick(uxGmap_OnMarkerClick); 
    } 

il codice all'interno del uxGmap_OnMarkerClick

private void uxGmap_OnMarkerClick(GMapMarker item, MouseEventArgs e) 
    { 
     currentMarker = item; 
     uxRemoveMarkerButton.Enabled = true; 
    } 

Ho un globale GMapMarker chiamato currentMarker che memorizza il marcatore item che si fa clic su. Attivo anche il pulsante per rimuovere il marker sul mio modulo.

Poi ho utilizzare un pulsante di scatto per rimuovere l'indicatore dalla mappa utilizzando:

private void uxRemoveMarkerButton_Click(object sender, EventArgs e) 
    { 
      int? mID = null; 
      if(currentMarker != null) 
      { 
       mID = Convert.ToInt32(currentMarker.Tag); 
       markersOverlay.Markers.Remove(currentMarker); 
       currentMarker = null; 
      } 
      m_dbMarkers.Delete(_table, String.Format("markers.ID = {0} ", mID)); 
      uxRemoveMarkerButton.Enabled = false; 
    } 

Il GMapMarker ha una proprietà Tag a dove posso memorizzare l'ID marcatore al marcatore. Estraggo quindi quell'ID dal mio globale currentMarker.Tag e lo memorizzo su un numero locale mID. Io uso questo mID per eliminare la riga con l'ID del marcatore che ho memorizzato nel database sqlite che ho. Inoltre, disattivo il pulsante per non consentire alcun errore utente fino a quando non si fa clic su un marker.