/// <summary> /// 重置mxd文档的数据源 /// </summary> /// <param name="pMapDoc"></param> /// <param name="pWs"></param> public static void ChangeMxdDataSource(ESRI.ArcGIS.Carto.IMapDocument pMapDoc, ESRI.ArcGIS.Geodatabase.IWorkspace pWs) { ESRI.ArcGIS.Geodatabase.IWorkspaceName pWsName = GetWorkspaceName(pWs); ESRI.ArcGIS.Carto.IMap pMap = pMapDoc.ActiveView.FocusMap; ESRI.ArcGIS.Carto.ILayer pLayer = null; ESRI.ArcGIS.Carto.IDataLayer pDataLayer = null; ESRI.ArcGIS.Geodatabase.IDatasetName pDataName = null; for (int i = 0; i < pMap.LayerCount; i++) { pLayer = pMap.get_Layer(i); if (pLayer.Valid == false) { if (pLayer is ESRI.ArcGIS.Carto.IDataLayer) { pDataLayer = pLayer as ESRI.ArcGIS.Carto.IDataLayer; try { pDataName = pDataLayer.DataSourceName as ESRI.ArcGIS.Geodatabase.IDatasetName; //获取DatasetName,必须是要替换的工作空间下的 ESRI.ArcGIS.Geodatabase.IDatasetName pDsName = GetDatasetName(pWs, pDataName.Name); if (pDsName == null) { continue; } pDataName = pDataLayer.DataSourceName as ESRI.ArcGIS.Geodatabase.IDatasetName; pDataName.WorkspaceName = pWsName; pDataLayer.Connect(pDsName as ESRI.ArcGIS.esriSystem.IName); System.Runtime.InteropServices.Marshal.ReleaseComObject(pDataName); System.Runtime.InteropServices.Marshal.ReleaseComObject(pDsName); //pDataName = pDataLayer.DataSourceName as ESRI.ArcGIS.Geodatabase.IDatasetName; } catch { } System.Runtime.InteropServices.Marshal.ReleaseComObject(pDataLayer); } } } System.Runtime.InteropServices.Marshal.ReleaseComObject(pWsName); System.Runtime.InteropServices.Marshal.ReleaseComObject(pMap); pMapDoc.Save(true, true); }
/// <summary> /// 从工作空间下获取到pFeatureClassName对应的 IDatasetName /// </summary> /// <param name="pWs"></param> /// <param name="pFeatureClassName"></param> /// <returns></returns> public static ESRI.ArcGIS.Geodatabase.IDatasetName GetDatasetName(ESRI.ArcGIS.Geodatabase.IWorkspace pWs, string pFeatureClassName) { try { ESRI.ArcGIS.Geodatabase.IEnumDatasetName pDsName = pWs.get_DatasetNames(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTAny); ESRI.ArcGIS.Geodatabase.IDatasetName pDsSetName = pDsName.Next(); while (pDsSetName != null) { //遍历FeatureDataset if (pDsSetName.Type == ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTFeatureDataset) { ESRI.ArcGIS.Geodatabase.IEnumDatasetName pDsFtName = pDsSetName.SubsetNames; ESRI.ArcGIS.Geodatabase.IDatasetName pDsSetName1 = pDsFtName.Next(); while (pDsSetName1 != null) { if (pDsSetName1.Name == pFeatureClassName) { System.Runtime.InteropServices.Marshal.ReleaseComObject(pDsName); System.Runtime.InteropServices.Marshal.ReleaseComObject(pDsFtName); return(pDsSetName1); } pDsSetName1 = pDsFtName.Next(); } } else if (pDsSetName.Name == pFeatureClassName) { System.Runtime.InteropServices.Marshal.ReleaseComObject(pDsName); return(pDsSetName); } System.Runtime.InteropServices.Marshal.ReleaseComObject(pDsSetName); pDsSetName = pDsName.Next(); } return(null);//pDsSetName; } catch (Exception ex) { return(null); } }