使用 c#_ArcEngine遇到的一些问题

窗体form.Show()与form.ShowDialog()

Show() 是非模式窗体,而 ShowDialog() 是模式窗体. ShowDialog() 在未按确定等键时(即未消失时),无法在桌面进行其他操作,只有 dialog 消失后,系统才会继续执行其他指令。Show()则不同,显示的同时,系统已经开始执行其他指令了。例如,一个窗体 form含有一个文本框和一个确定按钮,需要实现:在点击确定按钮时把文本框中的内容传给后续的代码。

//窗体“确定”按钮触发事件
private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text != "") {
                _bookMarkname = textBox1.Text;
            }
            this.Close();

        }
BookMarknameForm bookMnameF = new BookMarknameForm();
            bookMnameF.ShowDialog();  //打开输入书签名窗体
            string str = bookMnameF.bookMarkname;

这里不适合使用.Show()方法,不然str会是空值。用.ShowDialog() 是可以的。

在导入Shapefile文件时

所需的文件保存目录下,不只需要.shp文件,也需要:.dbf文件和 .shx文件。缺失这两个文件中任何一个会出现如下错误(其实函数的参数传入错误也会报这个错):

未处理 System.Runtime.InteropServices.COMException
  HResult=-2147467259
  Message=对 COM 组件的调用返回了错误 HRESULT E_FAIL。
  Source=ESRI.ArcGIS.Geodatabase
  ErrorCode=-2147467259
  StackTrace:
       在 ESRI.ArcGIS.Geodatabase.IFeatureWorkspace.OpenFeatureClass(String Name)
       在 myBookmark.MainForm.loadShapefiledataToolStripMenuItem_Click(Object sender, EventArgs e) 位置 C:\Users\Administrator\documents\visual studio 2010\Projects\myBookmark\myBookmark\MainForm.cs:行号 188
       在 System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
       在 System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e)
       在 System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
       在 System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
       在 System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met)
       在 System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
       在 System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
       在 System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventArgs mea)
       在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       在 System.Windows.Forms.Control.WndProc(Message& m)
       在 System.Windows.Forms.ScrollableControl.WndProc(Message& m)
       在 System.Windows.Forms.ToolStrip.WndProc(Message& m)
       在 System.Windows.Forms.ToolStripDropDown.WndProc(Message& m)
       在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       在 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       在 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       在 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
       在 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       在 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       在 System.Windows.Forms.Application.Run(Form mainForm)
       在 myBookmark.Program.Main() 位置 c:\users\administrator\documents\visual studio 2010\Projects\myBookmark\myBookmark\Program.cs:行号 27
       在 System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       在 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       在 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       在 System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

HRESULT:0x80040111 (CLASS_E_CLASSNOTAVAILABLE))

检索 COM 类工厂中 CLSID 为 {A06ADB96-D95C-11D1-AA81-00C04FA33A15} 的组件失败,原因是出现以下错误: 80040111 ClassFactory 无法供应请求的类 (异常来自 HRESULT:0x80040111 (CLASS_E_CLASSNOTAVAILABLE))。
解决方法:在程序入口加上:
ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Desktop);
还要记得添加引用:ESRI.ArcGIS.Version

  • System.Runtime.InteropServices.COMException: 异常来自 HRESULT:0x80040228
    这是因为没有添加ArcGIS engine license许可。解决方法:在程序入口加入:
    IAoInitialize m_aoinitialize = new AoInitializeClass(); m_aoinitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngine);
    该接口 描述如下:
    使用 c#_ArcEngine遇到的一些问题_第1张图片

GISMapControl.MainForm”不包含“miSpatialFilterToolStripMenuItem_Click”的定义

错误 1 “GISMapControl.MainForm”不包含“miSpatialFilterToolStripMenuItem_Click”的定义,并且找不到可接受类型为“GISMapControl.MainForm”的第一个参数的扩展方法“miSpatialFilterToolStripMenuItem_Click”(是否缺少 using 指令或程序集引用?) e:\visual studio 2010\Projects\GISMapControl\GISMapControl\MainForm.Designer.cs 332 85 GISMapControl
这种错误一般是在按钮属性里注册了点击事件函数,而在程序代码里没有相关函数的实现。所以解决方法是:要么在程序代码里加入该点击事件函数,要么就在按钮属性里注销该点击事件函数。注销方法有:在MainForm.Designer.cs里将注册该点击时间函数的代码删除或注释掉。
使用 c#_ArcEngine遇到的一些问题_第2张图片

未能将网站配置为使用ASP.NET 4.0…

使用 c#_ArcEngine遇到的一些问题_第3张图片使用 c#_ArcEngine遇到的一些问题_第4张图片
解决方法:安装.net framework 4.0补丁

Cannot acquire a lock

当你的 mapcontrol application 在运行时读取一个在ArcMap中已经打开的文件时,就有可能报这个错。

用git上传代码时出现如下问题

! [rejected]        master -> master (fetch first)
error: failed to push some refs to
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

解决:这是因为本地版本和主干上的有差异,先pull远端的版本,解决了冲突才能push。

A requested feature object could not be located

使用 c#_ArcEngine遇到的一些问题_第5张图片
出现这问题的原因是:我遍历要素类里的要素的某一属性值时,使用的是featureLayer.FeatureClass.GetFeature(i).get_Value(j)
应该使用

IFeatureCursor featureCursor = featureLayer.Search(null, false);
IFeature feature = featureCursor.NextFeature();
feature.get_Value(i);

每用户订阅上的所有者 SID 不存在 (异常来自 HRESULT:0x80040207)

原因是:WhereClause语句不规范。可参考这篇博文

将FeatureSelection选择集中的要素显示在视图中央###

			//将featureSelection接口转化为IFeatureLayer类型
            IFeatureLayer featureLayer = featureSelection as IFeatureLayer;
            //获取选择集中要素的分布范围
            IEnvelope envelope = featureLayer.AreaOfInterest;
            //将选择集中的要素的分布范围赋给activeView的Extent属性
            activeView.Extent = envelope;
            //刷新视图
            activeView.Refresh();

高亮显示要素

使用 c#_ArcEngine遇到的一些问题_第6张图片

删除要素类中所有要素

			 //打开要素类
			 barriesFClass = pFWorkspace.OpenFeatureClass("Barries");
            //判断该要素类里是否含有要素,若有,则删除
            if (barriesFClass.FeatureCount(null) > 0)
            {
                ITable pTable = barriesFClass as ITable;
                pTable.DeleteSearchedRows(null);
            }

ArcEngine开发中“错误类型"****"未定义构造函数”

解决方案:在引用中右键选中相关的库,查看属性,把“嵌入互操作类型”由True改成False。

低版本的ArcEngine项目升级到高版本的ArcEngine程序

参考这篇文章

你可能感兴趣的:(arcengine)