做了一个MDI程序,想在代码中动态创建地图控件,代码如下:
private void tabbedView1_QueryControl(object sender, DevExpress.XtraBars.Docking2010.Views.QueryControlEventArgs e) { Panel panel = new Panel(); ESRI.ArcGIS.Controls.AxMapControl axMapControl = new ESRI.ArcGIS.Controls.AxMapControl(); axMapControl.Location = new System.Drawing.Point(0, 0); axMapControl.Size = new System.Drawing.Size(100, 100); axMapControl.Dock = DockStyle.Fill; axMapControl.Name = "mapControl"; this.axTOCControl1.SetBuddyControl(axMapControl); panel.Location = new System.Drawing.Point(0, 0); panel.Size = new System.Drawing.Size(100, 100); panel.Dock = DockStyle.Fill; panel.Controls.Add(axMapControl); e.Control = panel; }
错误信息是:“The supplied buddy is not a supported object”,查看SetBuddyControl的说明,里面说他的参数可以使一下任何一种:MapControl, PageLayoutControl, SceneControl, GlobeControl or object implementing ITOCBuddy,而我们赋给的正是一个MapControl,这是没有问题的。检查发现,上述代码在执行到SetBuddyControl时,axMapControl对象是无法转换为ITOCBuddy接口对象的。这里很蹊跷,因为当我们把一个地图控件拖入窗体时,该控件也是按照上述方式创建的,为何到了这里就不行呢?因此对比窗体自动生成地图控件的代码,发现里面是这样写的:
this.axMapControl1.Dock = System.Windows.Forms.DockStyle.Fill; this.axMapControl1.Location = new System.Drawing.Point(0, 0); this.axMapControl1.Name = "axMapControl1"; this.axMapControl1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axMapControl1.OcxState"))); this.axMapControl1.Size = new System.Drawing.Size(247, 185); this.axMapControl1.TabIndex = 0;
private void tabbedView1_QueryControl(object sender, DevExpress.XtraBars.Docking2010.Views.QueryControlEventArgs e) { Panel panel = new Panel(); ESRI.ArcGIS.Controls.AxMapControl axMapControl = new ESRI.ArcGIS.Controls.AxMapControl(); axMapControl.Location = new System.Drawing.Point(0, 0); axMapControl.Size = new System.Drawing.Size(100, 100); axMapControl.Dock = DockStyle.Fill; axMapControl.Name = "mapControl"; System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); axMapControl.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axLicenseControl1.OcxState"))); this.axTOCControl1.SetBuddyControl(axMapControl); panel.Location = new System.Drawing.Point(0, 0); panel.Size = new System.Drawing.Size(100, 100); panel.Dock = DockStyle.Fill; panel.Controls.Add(axMapControl); e.Control = panel; }
private void tabbedView1_QueryControl(object sender, DevExpress.XtraBars.Docking2010.Views.QueryControlEventArgs e) { Panel panel = new Panel(); ESRI.ArcGIS.Controls.AxMapControl axMapControl = new ESRI.ArcGIS.Controls.AxMapControl(); axMapControl.BeginInit(); axMapControl.Location = new System.Drawing.Point(0, 0); axMapControl.Size = new System.Drawing.Size(100, 100); axMapControl.Dock = DockStyle.Fill; axMapControl.Name = "mapControl"; panel.Location = new System.Drawing.Point(0, 0); panel.Size = new System.Drawing.Size(100, 100); panel.Dock = DockStyle.Fill; panel.Controls.Add(axMapControl); axMapControl.EndInit(); this.axTOCControl1.SetBuddyControl(axMapControl); e.Control = panel; }