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