How to change the datasource of a layer. It changes the data source of the first layer in the selected dataframe.
[C#]
/// <summary> /// How to change the datasource of a layer. It changes the data source of the first layer in the selected dataframe. /// </summary> /// <param name="mxDocument">An IMxDocument interface.</param> /// <param name="strDatasource">A String that is the DataSource of a Coverage. Ex: "C:\arcgis\ArcTutor\Catalog\Yellowstone"</param> /// <param name="strFeatureClassName">A String that is the FeatureDataset name. Ex: "states"</param> /// <param name="strFeatureDatasetName">A String that is the FeatureClass name. Ex: "arc"</param> /// <remarks></remarks> public void SetDataSource(ESRI.ArcGIS.ArcMapUI.IMxDocument mxDocument, System.String strDatasource, System.String strFeatureClassName, System.String strFeatureDatasetName) { // Create a new ArcInfoWorkspaceFactory ESRI.ArcGIS.Geodatabase.IWorkspaceFactory workspaceFactory = new ESRI.ArcGIS.DataSourcesFile.ArcInfoWorkspaceFactoryClass(); // Get FeatureClass to be set as datasource ESRI.ArcGIS.Geodatabase.IWorkspace workspace = workspaceFactory.OpenFromFile(strDatasource, 0); // Cast from IWorkspace to IFeatureWorkspace ESRI.ArcGIS.Geodatabase.IFeatureWorkspace featureWorkspace = (ESRI.ArcGIS.Geodatabase.IFeatureWorkspace)workspace; ESRI.ArcGIS.Geodatabase.IFeatureDataset featureDataset = featureWorkspace.OpenFeatureDataset(strFeatureClassName); ESRI.ArcGIS.Geodatabase.IFeatureClassContainer featureClassContainer = (ESRI.ArcGIS.Geodatabase.IFeatureClassContainer)featureDataset; ESRI.ArcGIS.Geodatabase.IFeatureClass newFeatureClass = featureClassContainer.get_ClassByName(strFeatureDatasetName); // Get the focus map ESRI.ArcGIS.Carto.IMap map = mxDocument.FocusMap; // Cast from IMap to IActiveView ESRI.ArcGIS.Carto.IActiveView activeView = (ESRI.ArcGIS.Carto.IActiveView)map; // Cast from IMap to IMapAdmin2 ESRI.ArcGIS.Carto.IMapAdmin2 mapAdmin2 = (ESRI.ArcGIS.Carto.IMapAdmin2)map; // Get the first layer in the map ESRI.ArcGIS.Carto.ILayer layer = map.get_Layer(0); ESRI.ArcGIS.Carto.IFeatureLayer featureLayer = (ESRI.ArcGIS.Carto.IFeatureLayer)layer; ESRI.ArcGIS.Geodatabase.IFeatureClass oldFeatureClass = featureLayer.FeatureClass; // Change FeatureClass of layer featureLayer.FeatureClass = newFeatureClass; mapAdmin2.FireChangeFeatureClass(oldFeatureClass, newFeatureClass); // Redraw the map activeView.Refresh(); // Update and Refresh TOC ESRI.ArcGIS.Geodatabase.IFeatureDataset newFeatureDataset = (ESRI.ArcGIS.Geodatabase.IFeatureDataset)featureClassContainer; featureLayer.Name = newFeatureDataset.Name + " " + newFeatureClass.AliasName; ESRI.ArcGIS.ArcMapUI.IContentsView contentsView = mxDocument.CurrentContentsView; contentsView.Refresh(null); }
[Visual Basic .NET]
''' <summary> ''' How to change the datasource of a layer. It changes the data source of the first layer in the selected dataframe. ''' </summary> ''' <param name="mxDocument">An IMxDocument interface.</param> ''' <param name="strDatasource">A String that is the DataSource of a Coverage. Ex: "C:\arcgis\ArcTutor\Catalog\Yellowstone"</param> ''' <param name="strFeatureClassName">A String that is the FeatureDataset name. Ex: "states"</param> ''' <param name="strFeatureDatasetName">A String that is the FeatureClass name. Ex: "arc"</param> ''' <remarks></remarks> Public Sub SetDataSource(ByVal mxDocument As ESRI.ArcGIS.ArcMapUI.IMxDocument, ByVal strDatasource As System.String, ByVal strFeatureClassName As System.String, ByVal strFeatureDatasetName As System.String) ' Create a new ArcInfoWorkspaceFactory Dim workspaceFactory As ESRI.ArcGIS.Geodatabase.IWorkspaceFactory = New ESRI.ArcGIS.DataSourcesFile.ArcInfoWorkspaceFactoryClass ' Get FeatureClass to be set as datasource Dim workspace As ESRI.ArcGIS.Geodatabase.IWorkspace = workspaceFactory.OpenFromFile(strDatasource, 0) ' Cast from IWorkspace to IFeatureWorkspace Dim featureWorkspace As ESRI.ArcGIS.Geodatabase.IFeatureWorkspace = CType(workspace, ESRI.ArcGIS.Geodatabase.IFeatureWorkspace) Dim featureDataset As ESRI.ArcGIS.Geodatabase.IFeatureDataset = featureWorkspace.OpenFeatureDataset(strFeatureClassName) Dim featureClassContainer As ESRI.ArcGIS.Geodatabase.IFeatureClassContainer = CType(featureDataset, ESRI.ArcGIS.Geodatabase.IFeatureClassContainer) Dim newFeatureClass As ESRI.ArcGIS.Geodatabase.IFeatureClass = featureClassContainer.ClassByName(strFeatureDatasetName) ' Get the focus map Dim map As ESRI.ArcGIS.Carto.IMap = mxDocument.FocusMap ' Cast from IMap to IActiveView Dim activeView As ESRI.ArcGIS.Carto.IActiveView = CType(map, ESRI.ArcGIS.Carto.IActiveView) ' Cast from IMap to IMapAdmin2 Dim mapAdmin2 As ESRI.ArcGIS.Carto.IMapAdmin2 = CType(map, ESRI.ArcGIS.Carto.IMapAdmin2) ' Get the first layer in the map Dim layer As ESRI.ArcGIS.Carto.ILayer = map.Layer(0) Dim featureLayer As ESRI.ArcGIS.Carto.IFeatureLayer = CType(layer, ESRI.ArcGIS.Carto.IFeatureLayer) Dim oldFeatureClass As ESRI.ArcGIS.Geodatabase.IFeatureClass = featureLayer.FeatureClass ' Change FeatureClass of layer featureLayer.FeatureClass = newFeatureClass mapAdmin2.FireChangeFeatureClass(oldFeatureClass, newFeatureClass) ' Redraw the map activeView.Refresh() ' Update and Refresh TOC Dim newFeatureDataset As ESRI.ArcGIS.Geodatabase.IFeatureDataset = CType(featureClassContainer, ESRI.ArcGIS.Geodatabase.IFeatureDataset) featureLayer.Name = newFeatureDataset.Name + " " + newFeatureClass.AliasName Dim contentsView As ESRI.ArcGIS.ArcMapUI.IContentsView = mxDocument.CurrentContentsView contentsView.Refresh(Nothing) End Sub