Arcgis Engine(ae)接口详解(3):featureClass的feature编辑和删除

                //由于测试数据不完善,featureClass在此要只设null值,真实功能要设实际的值
IFeatureClass featureClass = null;

//获取某个字段的索引,后面取字段值用到
int xxxFieldIdx = featureClass.FindField("xxx");

IFeatureCursor featureCursor = featureClass.Search(null, true);
IFeature feature = null;

//获取到IWorkspaceEdit接口,IWorkspaceEdit是编辑必须的接口
IWorkspaceEdit workspaceEdit = (featureClass as IDataset).Workspace as IWorkspaceEdit;

//开始编辑的两个重要方法,StartEditing第一个参数是是否允许Undo,Redo(重做,撤销),如果是后台数据处理功能一般关系不大
workspaceEdit.StartEditing(true);
//构成一个EditOperation有StartEditOperation和StopEditOperation方法,Undo,Redo是针对一个EditOperation的
workspaceEdit.StartEditOperation();

//这里加try的原因是,如果编辑时出错,需要调用IWorkspaceEdit的一些方法来回滚修改内容
//而且编辑出错几率比一般功能大
try
{
List<int> lstOid = new List<int>();

while ((feature = featureCursor.NextFeature()) != null)
{
//修改属性字段的字段值
feature.Value[xxxFieldIdx] = "sss";

IPoint point = new PointClass();
point.PutCoords(111, 222);
//修改几何字段的字段值
//因为几何字段只有一个,所以不需要字段索引
feature.Shape = point;

//保存要素的修改
feature.Store();

//保存oid是为了之后的删除要素功能
lstOid.Add(feature.OID);
}

System.Runtime.InteropServices.Marshal.FinalReleaseComObject(featureCursor);

//删除
//由于不能在遍历要素时删除要素,因此其中一种删除要素的方法:是在遍历时收集要删除要素的oid,遍历完后再通过oid进行删除
foreach (int oid in lstOid)
{
//先通过oid获取要素,然后调用要素的Delete方法删除
IFeature featureDelete = featureClass.GetFeature(oid);
featureDelete.Delete();
}

//保存编辑
//之前的feature.Store()和featureDelete.Delete()都是临时保存,下面两句才是真实的保存
workspaceEdit.StopEditOperation();
//参数1是是否保存,false就是不保存,也就是恢复到修改前的状态
workspaceEdit.StopEditing(true);
}
catch (Exception ex)
{
//编辑出错需要以下两句,大意是数据回滚
workspaceEdit.StopEditOperation();
workspaceEdit.StopEditing(false);

//此处不记录异常,把异常抛出让系统统一处理
throw new Exception("", ex);
}
已邀请:

江宝骅

赞同来自:

要回复问题请先登录注册