我正在尝试构建一个包含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仍然存在并且有效。
有什么想法吗?
答案 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);
}
}