MapXtreme2004的Web选择控件
以下仅为个人分析结果,不当的地方请指正。
Web控件在MapXtreme里面所占的分量很少,很多的功能都没有。与Google Map相比而言,MapXtreme2004的WebGIS真的很过时了。但是项目不可能说变就变,该用什么就还得用什么。听说MapXtreme2005有很大的改观,我得找机会研究研究。
在MapXtreme2004里面的选择控件有一个可能是bug的现象:控件的选择事件(SelectChanged)会多次被触发,并且触发后传入对象的值还不一定相同。随着不断在地图上操作,触发的次数会不断增多。
不知道用过MapXtreme2004的同行有没有遇到这样的问题,有没有什么解决的办法。
我们还是先看一下他的结构:
跟用户操作有关的控件有两个分支:MapTool(MapInfoMapTool继承自MapTool)和ToolControl。MapTool分支封装了跟地图操作相关的功能。ToolControl继承自System.Web.UI.WebControls.WebControl,实现了控件设计时、客户端脚本等。应该说ToolControl分支是MapTool分支和Asp.net的桥梁。
MapTool Class
包含业务逻辑的控件的抽象类,所有的MapInfo工具都起源于它并实现了其中的业务逻辑。包括自定义工具也应该继承它。
其中比较关键的两个函数:Execute 包含制定的业务逻辑,每个工具都是通过此函数实现功能的。
ExtractPoints 从字符串中析取点集合
MapInfoMapTool Class
继承自MapTool,包含了MapXtreme特殊工具的一些公共的功能特性。关键点是多了一个 MapToolAction的事件。
ZooOutMapTool、DistanceMapTool、ZoomInMapTool、CenterMapTool、InfoMapTool、PanMapTool
继承自MapInfoMapTool,分别实现缩小、测距、放大、定位、点信息、平移功能。关键点是根据不同的功能实现了Execute方法,并触发MapToolAction事件。
MapInfoSelectionMapTool Class
也继承自MapInfoMapTool,包含了所有选择控件的公共特性。关键点是多了一个SelectionChanged事件。
文章开头描述的问题就出在这个SelectionChanged事件上。因为这个SelectionChanged事件实际是用Session.Current.Selections.DefaultSelection.SelectionChangedEvent += SelectionChangedEventHandler;进行绑定的。当它与ToolControl结合时需要将SelectionChanged事件与开发者的SelectionChangedEventHandler绑定。随着页面的刷新,此绑定会在每次刷新时被执行。但是Session.Current.Selections.DefaultSelection.SelectionChangedEvent是被服务器保存了的,多次执行必然使得事件绑定了多个相同函数。这应该就是为什么只有选择控件会不断增加触发事件次数的原因吧。至于为什么每次触发传入的对象的值不同,我想应该是Session.Current.Selections.DefaultSelection.SelectionChangedEvent本身会有几次触发。这个有待研究中。
RadiusSelectionMapTool、PolygonSelectionMapTool、RectangleSelectionTool、PointSelectionMapTool
继承自MapInfoSelectionMapTool,分别实现圆形、多边形、矩形、点选择功能。关键点是根据不同的功能实现了Execute方法,并触发MapToolAction事件。注意这些功能并不会触发SelectionChanged事件。
通过以上的说明,应该对MapTool有了一个大体了解。这个可以为我门编写MapXtreme服务器端控件打下基础。