Solved! Go to Solution.
ILayerFile lyrFile = new LayerFile(); lyrFile.Open("mylayer.lyr"); IGeoFeatureLayer storedGeoLayer = lyrFile.Layer as IGeoFeatureLayer; IGeoFeatureLayer targetGeoLayer = featureLayer as IGeoFeatureLayer; targetGeoLayer.Renderer = storedGeoLayer.Renderer; //Force the table of contents and currently drawn map to refresh using the new symbology ArcMap.Document.UpdateContents(); ArcMap.Document.ActiveView.Refresh();
IFeatureSelection storedSelProps = storedGeoLayer as IFeatureSelection; IFeatureSelection targetSelProps = targetGeoLayer as IFeatureSelection; targetSelProps.SelectionSymbol = storedSelProps.SelectionSymbol;
ILayerFile lyrFile = new LayerFile();
lyrFile.New("mylayer.lyr");
lyrFile.ReplaceContents(featureLayer);
lyrFile.Save();
ILayerFile lyrFile = new LayerFile();
lyrFile.Open("mylayer.lyr");
IFeatureLayer featureLayer = lyrFile.Layer;
ArcMap.Document.AddLayer(featureLayer);
//Save selection set after saving .lyr file
IFeatureSelection featSel = featureLayer as IFeatureSelection;
IEnumIDs enumIDs = featSel.SelectionSet.IDs;
List<int> listIDs = new List<int>();
int id = enumIDs.Next();
while (id > -1)
{
listIDs.Add(id);
id = enumIDs.Next();
}
System.IO.File.WriteAllText("mylayer.set", string.Join(",", listIDs));
//Load selection set after loading .lyr file
IFeatureSelection featSel = featureLayer as IFeatureSelection;
ISelectionSet selSet = featSel.SelectionSet;
IEnumerable<string> strIDs = System.IO.File.ReadAllText("mylayer.set").Split(',');
int id;
foreach (string strID in strIDs)
{
if (int.TryParse(strID, out id))
{
selSet.Add(id);
}
}
featSel.SelectionChanged();
Thanks Robert for your reply.
I could try to store the layer properties in a .lyr-file, but that gives a lot of overhead, and it takes time to open a .lyr-file, as it contains also a reference to the source (if the source can't be found, the symbology is invalid).
Dim layerFile As ILayerFile = New LayerFile
layerFile.Open(layerFilePath)
Dim templateLayer As ILayer = layerFile.Layer()
Dim objectCopy As IObjectCopy = New ObjectCopy
Dim renderer As IRasterRenderer = DirectCast(objectCopy.Copy(DirectCast(templateLayer, IRasterLayer).Renderer), IRasterRenderer)
rasterLayer.Renderer = renderer
ILayerFile lyrFile = new LayerFile(); lyrFile.Open("mylayer.lyr"); IGeoFeatureLayer storedGeoLayer = lyrFile.Layer as IGeoFeatureLayer; IGeoFeatureLayer targetGeoLayer = featureLayer as IGeoFeatureLayer; targetGeoLayer.Renderer = storedGeoLayer.Renderer; //Force the table of contents and currently drawn map to refresh using the new symbology ArcMap.Document.UpdateContents(); ArcMap.Document.ActiveView.Refresh();
IFeatureSelection storedSelProps = storedGeoLayer as IFeatureSelection; IFeatureSelection targetSelProps = targetGeoLayer as IFeatureSelection; targetSelProps.SelectionSymbol = storedSelProps.SelectionSymbol;
private IFeatureLayer FeatureLayerFromFeatureClass(IFeatureClass featureClass, string layername)
{
IFeatureLayer featureLayer = new FeatureLayerClass();
featureLayer.Name = layerName;
featureLayer.FeatureClass = featureClass;
IFeatureSelection featureSelection = featureLayer as IFeatureSelection;
if (File.Exists(_layerFilePath))
{
// open the layer from the .lyr-file
ILayerFile layerFile = new LayerFileClass();
layerFile.Open(_layerFilePath);
IGeoFeatureLayer sourceGeoFeatureLayer = layerFile.Layer as IGeoFeatureLayer;
// destination
IGeoFeatureLayer destinationGeoFeatureLayer = featureLayer as IGeoFeatureLayer;
// copier
IObjectCopy objectCopy = new ObjectCopyClass();
// get the symbology
IFeatureRenderer featureRenderer = objectCopy.Copy(sourceGeoFeatureLayer.Renderer) as IFeatureRenderer;
destinationGeoFeatureLayer.Renderer = featureRenderer;
// get the feature selectionsymbol
IFeatureSelection sourceFeatureSelection = sourceGeoFeatureLayer as IFeatureSelection;
featureSelection.SelectionSymbol = objectCopy.Copy(sourceFeatureSelection.SelectionSymbol) as ISymbol;
featureSelection.SetSelectionSymbol = true;
// close nicely
layerFile.Close();
}
return featureLayer;
}