Как сделать так, чтобы по нажатию кнопки в одной форме создавался объект и переходил в другую?

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

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

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

Вторая форма (Новый файл):

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» недоступен из-за его уровня защиты

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

Действительный XHTML.


person Golovach Grach    schedule 27.06.2016    source источник
comment
Что-то сломалось у меня в браузере, не могу использовать разметку. Спасибо, тарзанбаппа!   -  person Golovach Grach    schedule 27.06.2016
comment
Это потому, что polylineOverlay не является свойством public. Вы должны объявить его как public GMapOverlay polylineOverlay для быстрого и грязного исправления, но это неправильный способ справиться с этим (вы обходите инкапсуляцию). Например, вы можете создать геттер для этого объекта.   -  person Andrew    schedule 27.06.2016
comment
Я СОВЕРШЕННО новенький, неделю пытаюсь программировать на c#. Я не знаю, что такое геттер для объекта :( Можете ли вы объяснить мне, как я могу сделать это для своего примера, чтобы дать мне возможность понять это? Я хочу понять общий принцип этого.   -  person Golovach Grach    schedule 27.06.2016
comment
Я бы на данный момент проверил, работает ли добавление ключевого слова public. Тогда я бы предложил вам немного изучить C#, потому что Stack Overflow предназначен не для того, чтобы дать курс программирования, а для того, чтобы ответить на конкретные вопросы. В любом случае, вы можете найти некоторую информацию о геттерах и сеттерах здесь: сеть">stackoverflow.com/questions/17881091/   -  person Andrew    schedule 27.06.2016
comment
Общественные работы, да! Но теперь я не могу понять, как уничтожить созданные объекты :( Дело в том, что мне не нужно сейчас изучать С#, а пока сделать одно демо-приложение. Но я НАСТОЛЬКО плох, что не могу понять, что WTF происходит вокруг я, когда использую С#   -  person Golovach Grach    schedule 27.06.2016
comment
.NET использует сборщик мусора, обычно вам не нужно беспокоиться об уничтожении объектов или освобождении памяти, если только объект не использует огромный объем памяти или не является неуправляемым ресурсом, например соединением с базой данных. Подробнее об этом здесь: msdn.microsoft.com/en-us/library/0xy59wtx   -  person Andrew    schedule 27.06.2016


Ответы (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;
    }
}

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

person Andrew    schedule 27.06.2016
comment
О разрушении. Он создает все больше и больше полигонов, но я не могу их уничтожить, потому что не знаю, как это сделать. pp.vk.me/c604327/v604327505/14d84/fa5Z3UEDGl0.jpg - person Golovach Grach; 27.06.2016
comment
Я думаю, что это связано не с уничтожением, а с удалением точек из коллекции полигонов! Я предполагаю, что вам следует проверить документацию GMapPolygon по этому поводу. Что-то вроде _MapModule.PolylineOverlay.Polygons.Clear() не работает? - person Andrew; 27.06.2016
comment
О, да, спасибо! И последний вопрос. Мне нужно сделать много маркеров. Как я могу это сделать? Команда для создания 1: GMarkerGoogle marker = new GMarkerGoogle(new PointLatLng(53.864418, 27.520451), GMarkerGoogleType.green); Как сделать их много? - person Golovach Grach; 27.06.2016
comment
PointLatLng - тип данных, где координаты, а структура GMarkerGoogle - GMarkerGoogle (PointLatLng Points, GMarkerGoogleType) - person Golovach Grach; 27.06.2016
comment
Я никогда не использовал этот фреймворк, но, насколько я вижу, он должен быть таким же простым, как markersOverlay.Markers.Add(marker) со всеми маркерами, которые вы хотите. Посетите эту страницу для получения дополнительной информации об этом: независимый -software.com/ - person Andrew; 27.06.2016