GMap.NET - 将GMapControl放在UserControl中然后在Form上放置UserControl会产生MissingMethodException

时间:2012-03-20 18:45:57

标签: winforms gmap.net

我正在尝试构建一个包含GMapControl的USerControl。当我将GMapControl直接放在Form上时,它会按预期工作。但是,如果我将GMapControl放在UserControl上,然后将该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:找不到方法:'无效   GMap.NET.WindowsForms.GMapControl.set_MapProvider(GMap.NET,   MapProviders.GMapProvider)”。在OpenStreetMapTest.Map..ctor()'

如果我在Form中的UserControl Map中有相同的代码,那么没有错误。此外,如果我没有将GMapControl放在UserControl中,set_MapProvider仍然存在并且有效。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

反编译代码,看看Map construtor正在做什么。也许它是通过反思找到一些方法。想不出为什么你会得到一个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;
            }
        }

答案 1 :(得分:0)

你应该将所有内容包装在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);
    }
}