GMap.NET - размещение GMapControl в UserControl, а затем UserControl в форме приводит к исключению MissingMethodException - PullRequest
0 голосов
/ 20 марта 2012

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

Например:

My 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) ».at OpenStreetMapTest.Map..ctor () '

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

Есть идеи?

Ответы [ 2 ]

1 голос
/ 21 марта 2012

Декомпилируйте код и посмотрите, что делает конструктор Map. Может быть, это найти какой-то метод путем отражения. Не могу понять, почему иначе вы получите 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: /31263/designmode-s-vlozhennymi-elementami-upravleniya
        /// </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;
            }
        }
0 голосов
/ 20 марта 2012

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

например.

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);
    }
}
...