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