Set Data Source Snippet (ArcObjects .NET 10.6 SDK)
ArcObjects Library Reference

Set Data Source Snippet

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

Additional Requirements
  • The code in this document requires the following References added to the Visual Studio project:
  • ESRI.ArcGIS.ArcMapUI
  • ESRI.ArcGIS.Carto
  • ESRI.ArcGIS.DataSourcesFile
  • ESRI.ArcGIS.Display
  • ESRI.ArcGIS.Geodatabase
  • ESRI.ArcGIS.Geometry
  • ESRI.ArcGIS.System