2016-06-27 2 views
0

Я создаю простое приложение, работающее с картами на C#, используя для этого GMap.NET. Итак, мой вопрос: я хочу сделать полигоны, полилинии и маркеры в одной форме, используя другую. Мой код, относящиеся к нему:Как сделать так, чтобы нажатием кнопки в одной форме был создан объект и передан другому?

Первая форма (MapModule):

GMapOverlay polygonOverlay = new GMapOverlay("polygons"); 
    GMapOverlay markersOverlay = new GMapOverlay("markers"); 
    GMapOverlay polylineOverlay = new GMapOverlay("polylines"); 

Вторая форма (NewFile):

public MapModule _MapModule; 
     public Newfile(MapModule MapModule) 
     { 
      InitializeComponent(); 
      _MapModule = MapModule; 
     } 
private void addpolygon_Click(object sender, EventArgs e) 
     { 
      GMapPolygon polygon = new GMapPolygon(points, "What you need"); 
      _MapModule.polylineOverlay.Polygons.Add(polygon); 
     } 

Выход:

«GoogleMaps. MapModule.polylineOverlay 'недоступен из-за его уровня защиты

Я думаю, это должно быть очень просто, но я совершенно новый в программировании.

Valid XHTML.

+0

Что-то сломанное в моем браузере, я не могу использовать разметку. Спасибо, tarzanbappa! –

+0

Это потому, что 'polylineOverlay' не является собственностью' public'. Вы должны объявить его как «public GMapOverlay polylineOverlay» для быстрого и грязного исправления, но это не правильный способ его обработки (вы обходите инкапсуляцию). Например, вы можете создать геттер для этого объекта. – Andrew

+0

Я ПОЛНОСТЬЮ новый, я пытаюсь программировать на C# в течение недели. Я не знаю, что такое «getter для объекта» :(Можете ли вы объяснить мне, как я могу сделать это для моего примера, чтобы получить возможность понять это? Я хочу понять общий принцип этого. –

ответ

1

Первый быстрый и грязный вариант, чтобы сделать этот объект общественности:

public GMapOverlay polylineOverlay = new GMapOverlay("polylines"); 

Но это не очень хорошая практика, так как таким образом вы нарушаете принцип инкапсуляции и вы теряете контроль над о том, что происходит с ваш объект. Если эта переменная в какой-то момент имеет мусор, вам будет труднее узнать, почему это произошло.

Альтернативой является создание геттера, поэтому ссылка может быть доступна публично, хотя и не изменена.

private GMapOverlay polylineOverlay = new GMapOverlay("polylines"); 
public GMapOverlay PolylineOverlay 
{ 
    get 
    { 
     return this.polylineOverlay; 
    } 
} 

Содержащий класс может получить доступ к обоим, но другие классы могут получить доступ только к публичному объекту.

Кроме того, если вы не хотите, чтобы этот объект был создан, пока это не первая используется, вы могли бы сделать это вместо:

private GMapOverlay polylineOverlay; 
public GMapOverlay PolylineOverlay 
{ 
    get 
    { 
     if (this.polylineOverlay == null) 
      this.polylineOverlay = new GMapOverlay("polylines") 
     return this.polylineOverlay; 
    } 
} 

Хотя в этом случае, вы должны использовать государственную собственность в своем классе, или создать экземпляр в другом месте.

+0

Об уничтожении. Его создание все больше и больше полигона, но я не могу его уничтожить, потому что я не знаю, как это сделать. https://pp.vk.me/c604327/v604327505/14d84/fa5Z3UEDGl0.jpg –

+0

Я думаю, что это не связано с уничтожением, а с удалением точек из коллекции многоугольников! Я предполагаю, что вы должны проверить документацию GMapPolygon об этом. Разве что-то вроде '_MapModule.PolylineOverlay.Polygons.Clear()' работает? – Andrew

+0

О, да, спасибо! И последний вопрос. Мне нужно сделать много маркеров. Как я могу это сделать? Коммандой для создания 1 является GMarkerGoogle marker = новый GMarkerGoogle (новый PointLatLng (53.864418, 27.520451), GMarkerGoogleType.green); Как их сделать? –