Where is FeatureSource.GetDomain() gone?

4225
1
Jump to solution
05-21-2015 07:40 AM
MaximilianGlas
Esri Contributor

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?

0 Kudos
1 Solution

Accepted Solutions
MaximilianGlas
Esri Contributor

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

View solution in original post

0 Kudos
1 Reply
MaximilianGlas
Esri Contributor

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