I have to migrate a ArcGIS for Windows Mobile 10.0 solution to version 10.2.1.
It was a pain to replace all the new changes so far and now I have to care about a special problem.
In 10.0 there was a method named GetDomain() for the FeatureLayer class:
object domain = featureDataTable.FeatureSource.GetDomain( pSubTypeIndex, featureDataTable.Columns[featureDataTable.DisplayColumnIndex].ColumnName);
But this method no longer exists.
How could I get these domain information now?
Solved! Go to Solution.
Ok, I found a solution for myself.
The missing method has been moved to SourceDataColumn. I did not get, why, in my opinion it makes more sense where it has been before.
That's why I wrote a workaround class for me, which uses the old idea of getting access by FeatureSource instead of each column:
using System.Collections.Generic; using ESRI.ArcGIS.Mobile.FeatureCaching; public static class FeatureSourceExtensions { private static Dictionary<FeatureSource, Dictionary<string, IDomain>> _domains; /// <summary> /// Get all coded value domains for a feature source. Stores result after first access for increasing speed. /// </summary> /// <param name="featureSource"></param> /// <param name="subtypeCode">default seems to be 0 and is therefore set, but could be overwritten</param> /// <returns></returns> public static Dictionary<string, IDomain> GetDomains(this FeatureSource featureSource, int subtypeCode = 0) { if (_domains == null) { _domains = new Dictionary<FeatureSource, Dictionary<string, IDomain>>(); } if (!_domains.ContainsKey(featureSource)) { var featureDomain = new Dictionary<string, IDomain>(); foreach (var column in featureSource.Columns) { var domain = column.GetDomain(subtypeCode); if (domain != null) { featureDomain.Add(column.ColumnName, domain); } } _domains.Add(featureSource, featureDomain); } return _domains.ContainsKey(featureSource) ? _domains[featureSource] : null; } /// <summary> /// checks if a feature source has any domain values /// </summary> /// <param name="featureSource"></param> /// <param name="subtypeCode">default seems to be 0 and is therefore set, but could be overwritten</param> /// <returns></returns> public static bool HasDomains(this FeatureSource featureSource, int subtypeCode = 0) { return GetDomains(featureSource, subtypeCode).Count > 0; } /// <summary> /// returns a coded value domain for a special field /// </summary> /// <param name="featureSource"></param> /// <param name="columnName"></param> /// <param name="subtypeCode">default seems to be 0 and is therefore set, but could be overwritten</param> /// <returns></returns> public static IDomain GetDomain(this FeatureSource featureSource, string columnName, int subtypeCode = 0) { var domains = GetDomains(featureSource, subtypeCode); return domains.ContainsKey(columnName) ? domains[columnName] : null; } }
Ok, I found a solution for myself.
The missing method has been moved to SourceDataColumn. I did not get, why, in my opinion it makes more sense where it has been before.
That's why I wrote a workaround class for me, which uses the old idea of getting access by FeatureSource instead of each column:
using System.Collections.Generic; using ESRI.ArcGIS.Mobile.FeatureCaching; public static class FeatureSourceExtensions { private static Dictionary<FeatureSource, Dictionary<string, IDomain>> _domains; /// <summary> /// Get all coded value domains for a feature source. Stores result after first access for increasing speed. /// </summary> /// <param name="featureSource"></param> /// <param name="subtypeCode">default seems to be 0 and is therefore set, but could be overwritten</param> /// <returns></returns> public static Dictionary<string, IDomain> GetDomains(this FeatureSource featureSource, int subtypeCode = 0) { if (_domains == null) { _domains = new Dictionary<FeatureSource, Dictionary<string, IDomain>>(); } if (!_domains.ContainsKey(featureSource)) { var featureDomain = new Dictionary<string, IDomain>(); foreach (var column in featureSource.Columns) { var domain = column.GetDomain(subtypeCode); if (domain != null) { featureDomain.Add(column.ColumnName, domain); } } _domains.Add(featureSource, featureDomain); } return _domains.ContainsKey(featureSource) ? _domains[featureSource] : null; } /// <summary> /// checks if a feature source has any domain values /// </summary> /// <param name="featureSource"></param> /// <param name="subtypeCode">default seems to be 0 and is therefore set, but could be overwritten</param> /// <returns></returns> public static bool HasDomains(this FeatureSource featureSource, int subtypeCode = 0) { return GetDomains(featureSource, subtypeCode).Count > 0; } /// <summary> /// returns a coded value domain for a special field /// </summary> /// <param name="featureSource"></param> /// <param name="columnName"></param> /// <param name="subtypeCode">default seems to be 0 and is therefore set, but could be overwritten</param> /// <returns></returns> public static IDomain GetDomain(this FeatureSource featureSource, string columnName, int subtypeCode = 0) { var domains = GetDomains(featureSource, subtypeCode); return domains.ContainsKey(columnName) ? domains[columnName] : null; } }