ThinkGeo.com    |     Documentation    |     Premium Support

Null feature column value and classbreakstyle

Hi, i got a question,


If i use classbreakstyle on InMemoryFeatureLayer and have a feature in there which have a null column value, it will throw exception when the refresh() is called. The same thing happen if a column exist in the InMemoryFeatureLayer but there's no ColumnValue at the feature.


Does it intentionally enforce column value to have value or column value exist within a  layer to use a classbreak? Is there any workaround so that it works?



Juny, 
  
 Thanks for your questions! 
  
 Can you arrange a sample application for us so that we can re-create your problems exactly? I checked the DrawCore method of ClassBreakStyle class and found out if the column value is null, it will not throw any exceptions. So I need your sample to re-create this problem and fix it. 
  
 Thanks, 
  
 Scott,

It thows NullReferenceException at map.refresh() 
  
        
  static void Main(string[] args)
        {
            WinformsMap map = new WinformsMap();

            // create layer
            InMemoryFeatureLayer layer = new InMemoryFeatureLayer();
            layer.Open();
            layer.EditTools.BeginTransaction();

            // insert column to layer
            layer.Columns.Add(new FeatureSourceColumn("data", "double", 5));

            // add feature
            Feature f = new Feature(10, 10);
            f.ColumnValues.Add("data", null);
            layer.EditTools.Add(f);

            //create classbreak
            ClassBreakStyle cbs = new ClassBreakStyle("data");
            cbs.ClassBreaks.Add(new ClassBreak(Double.MinValue, AreaStyles.Evergreen1));
            cbs.ClassBreaks.Add(new ClassBreak(-20, AreaStyles.Crop1));
            cbs.ClassBreaks.Add(new ClassBreak(-10, AreaStyles.Park1));
            cbs.ClassBreaks.Add(new ClassBreak(0, AreaStyles.Military1));
            cbs.ClassBreaks.Add(new ClassBreak(10, AreaStyles.Forest1));
            cbs.ClassBreaks.Add(new ClassBreak(20, AreaStyles.Grass1));
            layer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(cbs);
            layer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            // close layer
            layer.EditTools.CommitTransaction();
            layer.Close();

            // add layer to map
            LayerOverlay lo = new LayerOverlay();
            lo.Layers.Add(layer);
            map.Overlays.Add(lo);
            map.Refresh();
        }


 Juny,


Thanks for your code! I re-created your the NullReference exception exactly, I'm looking for a solution for you if there are any results I will let you know,


Thanks,


Scott,



 Juny,


Thanks for your code! I re-created your the NullReference exception exactly, because the feature.ColumnValues["data"] value is null and the conversion is failed. There is a workaround for this issue, please refer the following code:


 



public class MyClassBreakStyle : ClassBreakStyle
    {
        public MyClassBreakStyle(string columnName)
            :base(columnName)
        {}

        protected override void DrawCore(System.Collections.Generic.IEnumerable<Feature> features, GeoCanvas canvas, System.Collections.ObjectModel.Collection<SimpleCandidate> labelsInThisLayer, System.Collections.ObjectModel.Collection<SimpleCandidate> labelsInAllLayers)
        {
            System.Collections.ObjectModel.Collection<Feature> newFeatures = new System.Collections.ObjectModel.Collection<Feature>();
            foreach (Feature feature in features)
            {
                if (feature.ColumnValues[this.ColumnName]== null)
                {
                    feature.ColumnValues.Remove(this.ColumnName);
                    feature.ColumnValues.Add(this.ColumnName, string.Empty);
                }

                newFeatures.Add(feature);
            }
            base.DrawCore(newFeatures, canvas, labelsInThisLayer, labelsInAllLayers);
        }
    }
  Please add the custom class above to your sample and use the MyClassBreakStyle to instead of the ClassBreakStyle when calling the ClassBreakStyle object. Then it will bypass the NullReference exception.


Any more questions please let me know again,


Thanks,


Scott,