GMap.NET — размещение GMapControl в UserControl, а затем UserControl в форме приводит к MissingMethodException

Я пытаюсь создать USerControl, содержащий GMapControl. Когда я помещаю GMapControl непосредственно в форму, он работает так, как ожидалось. Однако, если я помещаю GMapControl в UserControl, а затем добавляю этот UserControl в форму, я получаю ошибки.

Например:

Мой пользовательский контроль, Map.cs:

public Map()
        {
            InitializeComponent();

            gMapControl1.MapProvider = GMapProviders.OpenStreetMap;
            gMapControl1.Position = new PointLatLng(54.6961334816182, 25.2985095977783);
            gMapControl1.MinZoom = 1;
            gMapControl1.MaxZoom = 24;
            gMapControl1.Zoom = 9;

            top = new GMapOverlay("1");
            objects = new GMapOverlay("objects");
            routes = new GMapOverlay("routes");
            polygons = new GMapOverlay("polygons");

            gMapControl1.Overlays.Add(routes);
            gMapControl1.Overlays.Add(polygons);
            gMapControl1.Overlays.Add(objects);
            gMapControl1.Overlays.Add(top);

            gMapControl1.OnMarkerClick += new MarkerClick(gMapControl1_OnMarkerClick);
            gMapControl1.OnPolygonClick += new PolygonClick(gMapControl1_OnPolygonClick);
        }

Затем я добавляю этот UserControl в свою форму, перетаскивая его туда. Затем я получаю исключение:

Не удалось создать компонент «Карта». Далее следует сообщение об ошибке: «System.MissingMethodException: метод не найден: «Void GMap.NET.WindowsForms.GMapControl.set_MapProvider(GMap.NET, MapProviders.GMapProvider)». в OpenStreetMapTest.Map..ctor()'

Если у меня есть тот же код, что и на карте UserControl внутри формы, то ошибок нет. Кроме того, set_MapProvider существует и работает, если я не помещаю GMapControl внутрь UserControl.

Любые идеи?


person Ted    schedule 20.03.2012    source источник


Ответы (2)


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

По предположению DesignMode, это свойство совершенно не работает для вложенных пользовательских элементов управления, что очень расстраивает. Однако вы можете использовать следующий обходной путь (это свойство будет в классе UserControlBase, от которого вы будете наследоваться)

Просто отметьте IsDesignerHosted вместо IsDesignMode.

        /// <summary>
        /// Indicates if the code is being run in the context of the designer
        /// </summary>
        /// <remarks>
        /// <see cref="Component.DesignMode"/> always returns false for nested controls. This is one
        /// of the suggested work arounds here: http://stackoverflow.com/questions/34664/designmode-with-controls
        /// </remarks>
        public bool IsDesignerHosted
        {
            get
            {
                Control ctrl = this;

                while (ctrl != null)
                {
                    if ((ctrl.Site != null) && ctrl.Site.DesignMode)
                        return true;
                    ctrl = ctrl.Parent;
                }
                return false;
            }
        }
person Steven P    schedule 20.03.2012
comment
Спасибо, это сработало намного лучше! Я немного поигрался с разными способами проверки isDesignMode, но сработало только ваше решение =) - person Ted; 21.03.2012

вы должны обернуть все внутри if ( !DesignMode )

eg.

Map()
{
    InitializeComponent();

    if ( !DesignMode )
    {
        gMapControl1.MapProvider = GMapProviders.OpenStreetMap;
        gMapControl1.Position = new PointLatLng(54.6961334816182, 25.2985095977783);
        gMapControl1.MinZoom = 1;
        gMapControl1.MaxZoom = 24;
        gMapControl1.Zoom = 9;

        top = new GMapOverlay("1");
        objects = new GMapOverlay("objects");
        routes = new GMapOverlay("routes");
        polygons = new GMapOverlay("polygons");

        gMapControl1.Overlays.Add(routes);
        gMapControl1.Overlays.Add(polygons);
        gMapControl1.Overlays.Add(objects);
        gMapControl1.Overlays.Add(top);

        gMapControl1.OnMarkerClick += new MarkerClick(gMapControl1_OnMarkerClick);
        gMapControl1.OnPolygonClick += new PolygonClick(gMapControl1_OnPolygonClick);
    }
}
person Mladen Macanović    schedule 20.03.2012
comment
Другая проблема свойства DesignMode заключается в том, что оно не работает внутри конструктора UserControl или Form! dotnetfacts.blogspot.se/2009/01/ ... - person Ted; 21.03.2012