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;
}