此部分为编辑SDE数据而作的工具条,代码不完全,但是看看一般可以自己解决其余部分。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Collections;
using System.Windows.Forms;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.DataSourcesGDB;
namespace BZZDTQ
{
public class MapEdit
{
private AxToolbarControl m_ToolbarControl;
private dataBasePartments dbp;
private IEngineEditor m_engineEditor;
private IOperationStack m_operationStack;
private IMapControl3 m_MapControl = null;
private ICommandPool m_pool;
private IFeatureLayer m_CurrentLayer;
private string m_dataSetName;
private string m_AppPath;
public MapEdit()
{
}
public MapEdit(AxToolbarControl toolbarControl,IMapControl3 mapControl)
{
m_ToolbarControl = toolbarControl;
m_MapControl = mapControl;
m_CurrentLayer = new FeatureLayerClass();
m_ToolbarControl.AddItem("esriControls.ControlsEditingEditorMenu", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
m_ToolbarControl.AddItem("esriControls.ControlsEditingEditTool", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
m_ToolbarControl.AddItem("esriControls.ControlsEditingSketchTool", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
m_ToolbarControl.AddItem("esriControls.ControlsUndoCommand", 0, -1, true, 0, esriCommandStyles.esriCommandStyleIconOnly);
m_ToolbarControl.AddItem("esriControls.ControlsRedoCommand", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
m_ToolbarControl.AddItem("esriControls.ControlsEditingTargetToolControl", 0, -1, true, 0, esriCommandStyles.esriCommandStyleIconOnly);
m_ToolbarControl.AddItem("esriControls.ControlsEditingTaskToolControl", 0, -1, true, 0, esriCommandStyles.esriCommandStyleIconOnly);
m_ToolbarControl.AddItem("esriControls.ControlsUndoCommand", 0, -1, true, 0, esriCommandStyles.esriCommandStyleIconOnly);
m_ToolbarControl.AddItem("esriControls.ControlsRedoCommand", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
m_pool = new CommandPoolClass();
m_ToolbarControl.CommandPool = m_pool;
m_operationStack = new ControlsOperationStackClass();
m_ToolbarControl.OperationStack = m_operationStack;
m_ToolbarControl.SetBuddyControl(m_MapControl);
m_engineEditor = new EngineEditorClass();
m_engineEditor.EnableUndoRedo(true);
((IEngineEditProperties2)m_engineEditor).StickyMoveTolerance = 100000;
object tbr = (object)m_ToolbarControl.Object;
IExtension engineEditorExt = m_engineEditor as IExtension;
engineEditorExt.Startup(ref tbr);
}
public void SetDataset(string dataset)
{
m_dataSetName = dataset;
}
public void StartEdit()
{
m_CurrentLayer.FeatureClass = FindClassByName(m_CurrentLayer.FeatureClass.AliasName, m_dataSetName);
m_engineEditor.StartEditing(((IDataset)m_CurrentLayer.FeatureClass).Workspace, m_MapControl.Map);
IEngineEditLayers editLayer = m_engineEditor as IEngineEditLayers;
editLayer.SetTargetLayer(m_CurrentLayer, 0);
//setbut
}
public void SaveEdit()
{
m_engineEditor.StopEditing(true);
StartEdit();
}
public void StopEdit(bool save)
{
m_engineEditor.StopEditing(save);
}
public void SetTargetLayer( string layerName)
{
string featureclassName = null;
for (int i = 0; i < m_MapControl.Map.LayerCount; i++)
{
if (layerName == m_MapControl.Map.get_Layer(i).Name)
featureclassName = ((IFeatureLayer)m_MapControl.Map.get_Layer(i)).FeatureClass.AliasName;
}
if (featureclassName == null)
{
IEngineEditLayers editLayer = m_engineEditor as IEngineEditLayers;
editLayer.SetTargetLayer(null, 0);
return;
}
m_CurrentLayer.Name = layerName;
m_CurrentLayer.FeatureClass = FindClassByName(featureclassName, m_dataSetName);
if (m_CurrentLayer != null && m_engineEditor.EditState==esriEngineEditState.esriEngineStateEditing)
{
IEngineEditLayers editLayer = m_engineEditor as IEngineEditLayers;
editLayer.SetTargetLayer(null,0);
editLayer.SetTargetLayer(m_CurrentLayer, 0);
return;
}
}
public bool IsEditing()
{
if (m_engineEditor.EditState == esriEngineEditState.esriEngineStateNotEditing) return false;
else return true;
}
public IEngineEditor GetEngineEditor()
{
return m_engineEditor;
}
public ICommandPool GetCommandPool()
{
return m_pool;
}
public void OnEditTool()
{
m_ToolbarControl.CurrentTool = m_ToolbarControl.GetItem(1).Command as ITool;
}
public void OnSketchTool()
{
m_ToolbarControl.CurrentTool = m_ToolbarControl.GetItem(2).Command as ITool;
}
public IOperationStack GetOperationStack()
{
return m_operationStack;
}
public bool HasEdit()
{
return m_engineEditor.HasEdits();
}
public void Undo()
{
ICommand command = m_ToolbarControl.GetItem(7).Command;
command.OnClick();
}
public void Redo()
{
ICommand command = m_ToolbarControl.GetItem(8).Command;
command.OnClick();
}
public void SetCurrentTask(string taskName)
{
IEngineEditTask edittask ;
if (m_engineEditor.EditState == esriEngineEditState.esriEngineStateEditing)
{
switch (taskName)
{
case "Create New Feature":
edittask = m_engineEditor.GetTaskByUniqueName("ControlToolsEditing_CreateNewFeatureTask");
if (edittask != null)
{
m_engineEditor.CurrentTask = edittask;
}
break;
case "Modify Feature":
edittask = m_engineEditor.GetTaskByUniqueName("ControlToolsEditing_ModifyFeatureTask");
if (edittask != null)
{
m_engineEditor.CurrentTask = edittask;
}
break;
}
}
}
public IFeatureLayer GetCurLayer()
{
return m_CurrentLayer;
}
private bool IsLayerEditValid(string layerName)
{
//put in all business logic here
//In this example highways are not allowed to intersect the lakes layer
bool success = true;
//get the edit sketch
IEngineEditSketch editsketch = (IEngineEditSketch)m_engineEditor;
//get the protected areas layer
IFeatureLayer fLayer = FindFeatureLayer(layerName);
if (fLayer == null) success = false;
//do a spatial filter
if ((editsketch != null) && (fLayer != null) && (editsketch.Geometry != null))
{
IFeatureCursor cursor = FindFeatures(editsketch.Geometry, fLayer.FeatureClass, esriSpatialRelEnum.esriSpatialRelIntersects, m_MapControl.Map);
IFeature feature = cursor.NextFeature();
//could put more sophistictated logic in here
if (feature != null)
success = false;
}
return success;
}
private IFeatureLayer FindFeatureLayer(string name)
{
IFeatureLayer foundLayer = null;
IDataset dataset = null;
IMap map = m_MapControl.Map;
for (int i = 0; i < map.LayerCount; i++)
{
IFeatureLayer layer = map.get_Layer(i) as IFeatureLayer;
if (layer != null)
{
dataset = (IDataset)layer.FeatureClass;
if (layer.Name == name)
{
foundLayer = layer;
break;
}
}
}
return foundLayer;
}
private IFeatureCursor FindFeatures(IGeometry geometry, IFeatureClass featureClass, esriSpatialRelEnum spatialRelationship, IMap map)
{
//1 = esriSpatialRelIntersects
//7 = esriSpatialWithin
//8 = esriSpatialRelContains
ISpatialFilter spatialFilter = new SpatialFilter();
spatialFilter.Geometry = geometry;
spatialFilter.set_OutputSpatialReference(featureClass.ShapeFieldName, map.SpatialReference);
spatialFilter.GeometryField = featureClass.ShapeFieldName;
spatialFilter.SpatialRel = spatialRelationship;
IFeatureCursor featureCursor = featureClass.Search(spatialFilter, false);
return featureCursor;
}
public IWorkspace FindWsByDefault()
{
dbp = new dataBasePartments();
IPropertySet propSet = new PropertySetClass();
propSet.SetProperty("Server", dbp.getSDEserver());
propSet.SetProperty("Instance", dbp.getSDEport());
propSet.SetProperty("Database", dbp.getSDEdatabase());
propSet.SetProperty("User", dbp.getSDEuser());
propSet.SetProperty("Password", dbp.getSDEpwd());
propSet.SetProperty("Version", dbp.getSDEversion());
IWorkspaceFactory factory = new SdeWorkspaceFactoryClass();
IWorkspace workspace = factory.Open(propSet, 0);
return workspace;
}
//查找指定要素
public IFeatureClass FindClassByName(IWorkspace ws, string className, string dsName)
{
IEnumDataset enumDs;
if (dsName != "")
{
enumDs = ws.get_Datasets(esriDatasetType.esriDTFeatureDataset);
IFeatureDataset featureDs = enumDs.Next() as IFeatureDataset;
while (featureDs != null)
{
if (featureDs.Name == dsName)
{
return GetFcFromDataset(featureDs, className);
}
featureDs = enumDs.Next() as IFeatureDataset;
}
}
else
{
enumDs = ws.get_Datasets(esriDatasetType.esriDTFeatureClass);
return GetFcFromEnumDataset(enumDs, className);
}
return null;
}
//在数据集中查找要素类
private IFeatureClass GetFcFromDataset(IFeatureDataset featDs, string className)
{
IFeatureClass featClass;
IFeatureClassContainer fcContainer = featDs as IFeatureClassContainer;
for (int i = 0; i < fcContainer.ClassCount; i++)
{
featClass = fcContainer.get_Class(i);
if (featClass.AliasName == className)
{
return featClass;
}
}
return null;
}
//在要素类集合中查找要素类
private IFeatureClass GetFcFromEnumDataset(IEnumDataset enumDs, string className)
{
IFeatureClass featClass = enumDs.Next() as IFeatureClass;
while (featClass != null)
{
if (featClass.AliasName == className)
{
return featClass;
}
featClass = enumDs.Next() as IFeatureClass;
}
return null;
}
//通过要素类名和数据集名在指定的工作空间中寻找要素类
public IFeatureClass FindClassByName(string className, string datasetName)
{
IWorkspace ws = FindWsByDefault();
IFeatureClass featClass = FindClassByName(ws, className, datasetName);
return featClass;
}
}
}