在GPS指挥调动项目。我需要对MAPX上的地图数据进行查询。采用右击地图动态加载到右击菜单中。其中有个问题:右击菜单的一些项目是固定的如对地图对象的操作工具放大、缩小、手抓等,但是对于地图数据每次在不同的地方右击鼠标所指附近可能有多个地图图元,每次右击其内容和数量都是不确定。地图数据是动态加载,即每次右击时要将上次加载的数据删除掉再添加新的地图数据项。
我原来的解决版本是:
一.窗口设计部分:对于不变的菜单项在设计阶段做成一个菜单对象,对每项的tag设置为0。在动态加载时就可以用tag不为0的项目移除掉。
二.代码编码部分:
1.foreach循环读取右击菜单,将tag为0的ITEM,添加list<item>泛型集合中。这里为啥要先放在集合中,而不在枚举时直接remove,主要原因是remove之后右击菜单项目会立刻更改造成枚举的不确定性而报错。
2.枚举list<item>集合,在右击菜单remove掉这些item
3.循环查找地图数据放入stack<item>泛型栈集合中。
4.while循环stack出栈。在循环中将出栈的项加入右击菜单头。这里用栈的主要原因是地图数据搜索出来是按区、市、省这样小范围数据向大范围数据列举的。而如果直接按着这个版本每次加入右击菜单的头部会引起顺序的逆反。所以通过栈进行反序。
这个版本效率是很低,从上面的描述中可以发现每一步都需要循环,而且第四步因为地图控件的原因还需要双重循环。
后来就有了这个版本:
一、窗口设计部分:这个思想是菜单每次所有内容都是动态生成,不变菜单项也是每次生成时从另一个菜单中添加。
1.把不变的菜单项画成一个菜单我这里取名:菜单A
2.在建立一个空的菜单取名:菜单B
二、代码编码部分
1.菜单B.Clear();清空里面所有的项目。
2.循环查找地图数据放入菜单B中。
3.枚举遍历菜单A,将其中的项的Clone()添加进菜单A中。
注意这里我是克隆项。为啥,这也就是我解决此问题让我郁闷的地方。原来我紧紧是枚举菜单A,将菜单A的项目添加进菜单B中。发现不是报错就是有问题。现象的原因是这样的:当我直接通过菜单A的ADD(菜单B枚举时的当前项),应该是移动操作,即项目进入菜单A时也就来开了菜单B。这样会造成枚举的失败。我以前自以为这样的操作就是复制操作。唉。
PS:枚举的解释:枚举,这是微软爱用的词,意思为循环遍历一个集合。和枚举类型的枚举为同词二意。
PPS:MAPX的mouseup事件中的坐标也是鼠标的坐标非地图的坐标,而这个坐标跟C#直接获取的鼠标坐标数值不一样,没有深入研究,可能是相对值不一样。通过MAPX的ConvertCoord()来实现屏幕坐标与地图坐标的转换如:
this.Map.ConvertCoord(ref e.x,ref e.y,ref x, ref y, ConversionConstants.miScreenToMap);其中x,y是参数返回。
PPS:MapX在C#中的BUG还真不少,这里就有一个bug——>Features无法实例化即无法用New初始化,否则会报错。Mapx的报错很讨人嫌,它不跳出出错对话框,而是在输出窗口告诉你,它出现了一个错误,执行的代码会在出错出立刻返回。
PPPS:搜索通过坐标搜索地图数据的办法这要搞定layer.SearchAtPoint(pt,SearchResultTypeConstants.miSearchResultDefault);pt为Mapx的点类型,通过上面提示的办法帮e.x,e.y转换为地图坐标。