![](https://www.cnblogs.com/images/cnblogs_com/happyhzs2000/map.jpg)
最近做一个关于MapQuest的功能模块,首先介绍一下MapQuest,它是一家资深的帮助客户在地图上定位的公司,比如说根据业务需求,在地图上显示我要关注的地点;我的合作伙伴和员工的地点;在指定地区显示所有的超市,银行等等。
我的这个模块需求是,在地图上显示离指定的一个Job地点最近的五个承包商或者技术员工的地点,并用不同的图标显示出来。我想要总结的有几点。
1. 存储员工或者承包商的坐标字段(Longitude, Latitude)有可能为null,所以在通过MapQuest用WebService获取经纬度值后需要存储到数据库,方便以后直接从数据库中读出,而不是调用WebService向MapQuest请求坐标信息。当从数据库Fill进一个DataTable, 名为dtTechnicians, 再将此DataTable引用传入一个GeoCode函数,此函数检查DataTable, 如果DataRow里的Longitude和Latitude 为null,就调用WebService索取坐标值赋值给两个字段。怎么将开始坐标为空的记录保存回数据库呢?如果一次全部将DataTable里的记录update一下显然不是最好的方法,因为有的记录已经有了坐标值。经过思考,发现DataRow有个RowState属性,当用适配器Fill进DataTable时,每个DataRow的RowState为DataRowState.Unchanged,经过GeoCode函数所更改过的DataRow,其RowState为DataRowState.Modified,所以可以遍历DataTable,检查DataRow的RowState,如果是DataRowState.Modified就可以保存到数据库了。
2. 当做好显示指定位置所要的准备工作后, 即拥有一个DataTable,客户还要求只显示
可以这么做:
Dim dv as DataView = dtMap.DefaultView
dv.RowFilter = "Distance <
最后将这个DataView赋值给MapQuest。
总结:
1. DataRow里的RowState很重要, 它是DataAdapter做Update的关键所在。
如果RowState为DataRowState.Added, DataAdapter就用你的更新逻辑向数据库插入记录;
如果RowSate为DataRowState.Deleted,DataAdapter就用你的更新逻辑向数据库删除记录;
如果RowSate为DataRowState.Modified,DataAdapter就用你的更新逻辑向数据库更改记录;
2. DataView经常和DataTable结合使用。
![](/images/cnblogs_com/happyhzs2000/qsygsl.jpg)