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