Solved! Go to Solution.
A.2 layer is visble in map. But A.2 has been removed successfully on legend refreshed event
foreach (var pair in toDeletes) { var parentLayerItem = pair.Item1; var layerItemToDelete = pair.Item2; parentLayerItem.LayerItems.Remove(layerItemToDelete); Layer layer = parentLayerItem.Layer; int subID = layerItemToDelete.SubLayerID; if (layer is ISublayerVisibilitySupport && subID > 0)* (layer as ISublayerVisibilitySupport).SetLayerVisibility(subID, false); parentLayerItem.Layer.SetSublayerViisbility(layerItemToDelete.SublayerId, false); }
private void Legend_Refreshed(object sender, Legend.RefreshedEventArgs e) { List<LayerItemViewModel> removeLayerItemVM = new List<LayerItemViewModel>(); List<LayerItemViewModel> removeLayerItemVM2 = new List<LayerItemViewModel>(); List<string> removeLayers = new List<string>(); removeLayers.Add("Service Agreement Areas"); removeLayers.Add("HTE Routes"); removeLayers.Add("Water 3-way"); removeLayers.Add("Water 4-way"); removeLayers.Add("Water 5-way"); removeLayers.Add("Water 6-way"); if (e.LayerItem.LayerItems != null) { foreach (LayerItemViewModel layerItemVM in e.LayerItem.LayerItems) { //removes the feature layers in the water group layer from the legend: foreach (LayerItemViewModel livm in layerItemVM.LayerItems) { foreach (string rlayer in removeLayers) { if (livm.Label == rlayer) removeLayerItemVM2.Add(livm); } } foreach (LayerItemViewModel rlivm in removeLayerItemVM2) { layerItemVM.LayerItems.Remove(rlivm); } //collapses all the legend items: if (layerItemVM.IsExpanded == true) { layerItemVM.IsExpanded = false; for (int i = 0; i < layerItemVM.LayerItems.Count; i++) { layerItemVM.LayerItems.IsExpanded = false; } } //removes all the other group layers from the legend: if (layerItemVM.Label == "General Layers") removeLayerItemVM.Add(layerItemVM); else if (layerItemVM.Label == "Storm Layers") removeLayerItemVM.Add(layerItemVM); else if (layerItemVM.Label == "Sewer Layers") removeLayerItemVM.Add(layerItemVM); } foreach (LayerItemViewModel remLayerItemVM in removeLayerItemVM) { e.LayerItem.LayerItems.Remove(remLayerItemVM); } } else { e.LayerItem.IsExpanded = false; } }
Basically I look for recursive loop logic to handle the case. I have seen another thread where dbroux provided sample for getting selecetd items but that does not help me.
public static class LegendExtensions{ // Go recursively through the LayerItems and return a tuple <parent, child> for each child public static IEnumerable<Tuple<LayerItemViewModel, LayerItemViewModel>> GetAllParentChild(this LayerItemViewModel layerItem) { return layerItem == null || layerItem.LayerItems == null ? Enumerable.Empty<Tuple<LayerItemViewModel, LayerItemViewModel>>() : layerItem.LayerItems.SelectMany(child => new[] { new Tuple<LayerItemViewModel, LayerItemViewModel>(layerItem, child) }.Concat(GetAllParentChild(child))); } }
var toDeletes = LayerItem.GetAllParentChild().Where(pair => new[] {"Service Agreement Areas", "HTE Routes", ....}.Contains(pair.Item2.Label)).ToArray(); foreach (var pair in toDeletes) pair.Item1.LayerItems.Remove(pair.Item2);
dbroux ,
Thank you. I could able to get tuple pair of parent,child which I need to delete. But I do not understand second part, can you please explain in simple terms?.
foreach (var pair in toDeletes) { var parentLayerItem = pair.Item1; var layerItemToDelete = pair.Item2; parentLayerItem.LayerItems.Remove(layerItemToDelete); }
IEnumerable<Tuple<LayerItemViewModel, LayerItemViewModel>> tupleParentChild; // declaration if (e.LayerItem.LayerItems != null) { foreach (LayerItemViewModel layerItemVM in e.LayerItem.LayerItems) { if (layerItemVM.IsGroupLayer) { composites.Add(layerItemVM); while (composites.Count > 0) { LayerItemViewModel layerItemVMGroup = composites[0]; foreach (LayerItemViewModel innerLayerItems in layerItemVMGroup.LayerItems) { if (innerLayerItems.IsGroupLayer == false) { innerLayerItems.IsExpanded = true; // Requirement : If strVisibleArray3D does not contains then remove the layer from Legend if (!strVisibleArray3D.Contains(innerLayerItems.Label)) { // dbroux method to get the parent child using legend extension method tupleParentChild = LegendExtension.GetAllParentChild(innerLayerItems); // issue always tupleParentChild has a pair of values but looping does not taking place foreach (var pair in tupleParentChild.ToArray()) { var parentLayerItem = pair.Item1; var layerItemToDelete = pair.Item2; parentLayerItem.LayerItems.Remove(layerItemToDelete); } } else { if (strPrefLayers.Contains(innerLayerItems.Label)) { innerLayerItems.IsEnabled = true; innerLayerItems.IsSelected = true; } } } else { composites.Add(innerLayerItems); } } composites.Remove(layerItemVMGroup); } } else { if (!strVisibleArray3D.Contains(layerItemVM.Label)) { // remove the layer } else { if (strPrefLayers.Contains(layerItemVM.Label)) { layerItemVM.IsEnabled = true; layerItemVM.IsSelected = true; } } } }
private void Legend_Refreshed(object sender, Legend.RefreshedEventArgs e) { List<string> removeLayers = new List<string> { "Service Agreement Areas", "HTE Routes", "Water 3-way", "Water 4-way", "Water 5-way", }; var toDeletes = LayerItem.GetAllParentChild().Where(pair => removeLayers.Contains(pair.Item2.Label)).ToArray(); foreach (var pair in toDeletes) pair.Item1.LayerItems.Remove(pair.Item2); }