属性表的编辑功能开发
首先获取 IEngineEditor类,添加静态字段
public static IEngineEditor m_EngineEditor = new EngineEditorClass();
可使用此字段控制ArcEngine的编辑功能 开始编辑 保存编辑 撤回编辑 停止编辑等。
1.通过GridView的.ShowingEditor事件控制属性表允许编辑的字段
private void gvStartEdit(object sender, CancelEventArgs e)
{
GridView gv = (GridView)sender;
//图层是否可编辑
IEngineEditor m_engineEditor = new EngineEditorClass();
IEngineEditLayers m_engineLayersEditor = m_engineEditor as IEngineEditLayers;
IFeatureLayer key = null;
key = gv.Tag as IFeatureLayer; //获取GridView对应的要素图层
if (!m_engineLayersEditor.IsEditable(key)) //判断当前GridView的图层是否开启了编辑
{
e.Cancel = true; //没有开始就取消编辑事件
return;
}
//禁止编辑字段列表
System.Collections.Generic.List<string> ProhibitEditField = new System.Collections.Generic.List<string> { "OBJECTID", "FID", "Shape" };
if (ProhibitEditField.Contains(gv.FocusedColumn.FieldName))
{
e.Cancel = true; //当前点击的字段在禁止列表中就取消编辑事件
}
}
2.通过GridView.CellValueChanged事件 在单元格被修改时将修改同步到对应的要素中去
使用AxToolbarControl的编辑工具时,修改时必须使用IEngineEditor.StartOperation()和 mainMap.m_EngineEditor.StopOperation()
否则停止编辑时,不会弹出是否要保存的提示框。
mainMap.m_EngineEditor.StartOperation();
GridView gv = (GridView)sender;
Attribute Ab = mainMap.LayerAttributeDict[gv.Tag as IFeatureLayer];
int Oid = int.Parse(gv.GetRowCellValue(e.RowHandle, this.oidFieldName).ToString());
string ColumnName = e.Column.FieldName;
string Value = e.Value.ToString();
ITable table = (gv.Tag as IFeatureLayer).FeatureClass as ITable;
IRow row = table.GetRow(Oid);
row.Value[table.FindField(ColumnName)] = Value;
row.Store();
mainMap.m_EngineEditor.StopOperation("属性修改");
RowAndCol pRowAndCol = new RowAndCol(); ///用来保存修改的记录 然后同步记录到没有修改的GridView
pRowAndCol.Oid = Oid;
pRowAndCol.Column = this.fieldIndex[e.Column.FieldName];
pRowAndCol.Value = Value;
/// UpdateGvEdit 一个将修改同步到 DataTable的方法
if (Ab.IsShowAll == false)
{//当前修改在 显示所选记录
UpdateGvEdit(Ab.GridControlForAll.DataSource as DataTable, pRowAndCol);
}
else
{
UpdateGvEdit(Ab.GridControlForSelect.DataSource as DataTable, pRowAndCol);
}
和ArcMap一样修改的内容需要保存编辑后才能真正保存到要素类