Map 3D 2010 开发中的OnCheckIn事件处理
我们将谈一下Map 3D 2010开发中常见的事件处理,并通过一个简单的小例子来掩饰Map 3D 常见事件处理的应用方法。
比如有这样一个应用场景,一个要素类中有一些计算字段,即这些字段的值是根据其他字段的值按照一定规则计算出来的,如由单位地价和面积,计算出地块总价。一些数据库引擎本身已经内置的自动计算的功能,但也有些时候需要我们来编码实现。当然如果用户对记录进行更改后就需要重新计算以保证数据的一致性。当然,我们可以在用户刚刚更改结束后就立即重新计算,但是为了不用无用功,我们没必要为客户在每次犹豫不定的更改都重新计算,只需要在他提交最终修改结果时重新计算就可以了。嗯,好主意,Map 3D要是有类似 OnCheckIn之类的事件就好了。
不过可惜的是,查了半天也没有这样一个事件,真是让人沮丧啊。不过不用着急,虽然没有一个这么明显的,但是我们有一系列的事件处理函数来组合一下即可。我们看一下AcMapFeatureService的相关事件,我们可以在帮助文档中查到:
顺便说一下,这些帮助文档可以在 Map ObjectARX SDK中找到。这个开发包中不仅包含了Map 3D开发的所有文档,而且还包含了好多实例代码工程(C++,C#
或者VB.NET),几乎大多数的开发场景都能从例子中找到。
我们所需要的OnCheckIn事件虽然没有,但是我们有三个 FeatureDeleted ,FeatureInserted 和FeatureUpdated。这同样能实现我们的checkin事件。
下面我们看一下代码片段:
[CommandMethod("AddFSEvents")] public void AddFeatureServicesEvents() { AcMapFeatureService fs = AcMapServiceFactory.GetService(MgServiceType.FeatureService) as AcMapFeatureService; fs.FeatureUpdated += new FeatureUpdatedHandler(fs_FeatureUpdated); AcMapMap currentMap = AcMapMap.GetCurrentMap(); currentMap.FeatureInstanceModified += new FeatureInstanceModifiedHandler(currentMap_FeatureInstanceModified); } // 这个事件,客户的每次更改都会触发,即使还没有提交,这不是我们想要的
//fired at one when the feature is updated void currentMap_FeatureInstanceModified(object sender, FeatureInstanceModifiedEventArgs args) { ed.WriteMessage("FeatureInstanceModified fired!\n"); } //fired when the feature is updated and checked in //if more than one feature are updated, it will be fired more times
//这才是我想要的,只有在更新被CheckIn的时候才触发。
//我们可以通过Args.GetFeature()得到正在提交的那个要素,下面的代码演示了如果获取这个要素的相关信息
//如果有多个要素同时被更新,事件会触发多次,从而你可以处理每一条记录 void fs_FeatureUpdated(object sender, AcMapFeatureEventArgs args) { ed.WriteMessage("FeatureUpdated fired! \n"); ed.WriteMessage("--------------------------------------\n"); ed.WriteMessage("PropertyName \t Value \n"); MgPropertyCollection props = args.GetFeature().GetProperties(); int propCount = props.Count; for (int i = 0; i < propCount; i++) { string propName = props[i].Name; string valueString; switch (props[i].GetPropertyType()) { case MgPropertyType.Int32: valueString = (props[i] as OSGeo.MapGuide.MgInt32Property).GetValue().ToString(); break; case MgPropertyType.String: valueString = (props[i] as OSGeo.MapGuide.MgStringProperty).GetValue().ToString(); break; default: valueString = "<***>"; break; } ed.WriteMessage(propName + "\t" + valueString + "\n"); } ed.WriteMessage("------------------------------------\n"); }
这个例子我实现了FeatureUpdated事件,类似的还有FeatureDeleted 和FeatureInserted 你可以自己来参照试试看。