C#2005+ArcGIS Engine9.1开发中OnSelectionChanged事件的bug
前面曾写过一篇博文,名字为《AxMapControl与MapControl冲突及IMapControlEvents2_OnMouseDownEventHandler错误的解决方法》,主要讲的是C#2005+AE的开发中,双击MapControl产生的MouseDown事件错误,结果ESRI的事件错误还真不少,今天又让我给遇到了。本来想使用MapControl的OnSelectionChanged事件,结果又发现了一个让我莫名其妙的错误。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
我的目的是,当地图的选择集(ISelectionSet)发生变化时,弹出MessageBox告知用户目前选中的Feature的数目。但是当我从MapControl控件的属性管理器中,双击OnSelectionChanged产生事件代理和事件函数,并在事件函数内写好代码,运行后发现,选择集的变化并没有产生任何行为,这让我感到非常奇怪。后来仔细看了一下程序自动生成的事件代理和事件方法,发现居然是这样的:
this.axMapControl1.OnSelectionChanged += new System.EventHandler(this.axMapControl1_OnSelectionChanged);
private void axMapControl1_OnSelectionChanged(object sender, EventArgs e)
{
}
不难发现,它自动生成的关于事件的代码,居然使用的是.NET事件代理和.NET事件参数,真是搞不懂为什么。没办法,只好自己用AO写一个了。使用的事件代理是:public delegate void IMapControlEvents2_OnSelectionChangedEventHandler(),但是却不知道axMapControl1_OnSelectionChanged()方法的参数到底是什么样子的呢?结果我先使用.NET对象浏览器来察看ESRI.ArcGIS.MapControl这个dll下的类,结果发现了ESRI.ArcGIS.MapControl.IMapControlEvents2_OnSelectionChangedEventHandler事件赫然在列,但是却没有提供ESRI.ArcGIS.MapControl.IMapControlEvents2_OnSelectionChangedEvent参数,而其他的所有事件一般都提供了相应的Event参数。于是再使用Reflector查看MapControl.dll,让人很奇怪的是,Reflector的解析的结果中却看不到任何IMapControlEvents2_OnSelectionChangedEventHandler的影子,原来ESRI提供的这个事件居然是个在.NET环境中的假货??(分别如图1和图2所示)
图1 。net对象浏览器结果
图2 Reflector解析结果