0

我正在尝试构建一个包含 GMapControl 的 USerControl。当我将 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);
        }

然后我通过将它拖到那里将它添加到我的表单中。然后我得到一个例外:

未能创建组件“地图”。错误消息如下:'System.MissingMethodException:找不到方法:'Void GMap.NET.WindowsForms.GMapControl.set_MapProvider(GMap.NET,MapProviders.GMapProvider)'。在 OpenStreetMapTest.Map..ctor()'

如果我在表单内的 UserControl 映射中具有相同的代码,则不会出现错误。此外,如果我不将 GMapControl 放在 UserControl 中,set_MapProvider 就会存在并且可以工作。

有任何想法吗?

4

2 回答 2

1

反编译代码,看看 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: 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;
            }
        }
于 2012-03-20T22:45:50.800 回答
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);
    }
}
于 2012-03-20T18:59:34.047 回答